Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 98 additions & 11 deletions src/main/java/com/github/hcsp/sql/Sql.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@

package com.github.hcsp.sql;

import java.io.File;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.List;

public class Sql {
Expand Down Expand Up @@ -72,8 +76,10 @@ public String toString() {
* 题目1:
* 查询有多少所有用户曾经买过指定的商品
*
* @param goodsId 指定的商品ID
* @param databaseConnection 数据库连接
* @param goodsId 指定的商品ID
* @return 有多少用户买过这个商品
* @throws SQLException SQL异常
*/
// 例如,输入goodsId = 1,返回2,因为有2个用户曾经买过商品1。
// +-----+
Expand All @@ -82,16 +88,29 @@ public String toString() {
// | 2 |
// +-----+
public static int countUsersWhoHaveBoughtGoods(Connection databaseConnection, Integer goodsId) throws SQLException {
return 0;
try (PreparedStatement statement = databaseConnection.prepareStatement("select count(distinct USER_ID)\n" +
" from `ORDER`where GOODS_ID=?")) {

statement.setInt(1, goodsId);
ResultSet resultSet = statement.executeQuery();

while (resultSet.next()) {
return resultSet.getInt(1);
}
return -1;
}

}

/**
* 题目2:
* 分页查询所有用户,按照ID倒序排列
*
* @param pageNum 第几页,从1开始
* @param pageSize 每页有多少个元素
* @param databaseConnection 数据库连接
* @param pageNum 第几页,从1开始
* @param pageSize 每页有多少个元素
* @return 指定页中的用户
* @throws SQLException SQL异常
*/
// 例如,pageNum = 2, pageSize = 3(每页3个元素,取第二页),则应该返回:
// +----+----------+------+----------+
Expand All @@ -100,7 +119,21 @@ public static int countUsersWhoHaveBoughtGoods(Connection databaseConnection, In
// | 1 | zhangsan | tel1 | beijing |
// +----+----------+------+----------+
public static List<User> getUsersByPageOrderedByIdDesc(Connection databaseConnection, int pageNum, int pageSize) throws SQLException {
return null;
try (PreparedStatement statement = databaseConnection.prepareStatement("select * from USER order by id desc limit ?,?")) {
statement.setInt(1, pageSize);
statement.setInt(2, (pageNum - 1) * pageSize);
ResultSet resultSet = statement.executeQuery();
List<User> users = new ArrayList<>();
while (resultSet.next()) {
User user = new User();
user.id = resultSet.getInt(1);
user.name = resultSet.getString(2);
user.tel = resultSet.getString(3);
user.address = resultSet.getString(4);
users.add(user);
}
return users;
}
}

// 商品及其营收
Expand All @@ -118,6 +151,10 @@ public String toString() {
/**
* 题目3:
* 查询所有的商品及其销售额,按照销售额从大到小排序
*
* @param databaseConnection 数据库连接
* @return 所有的商品及其销售额,按照销售额从大到小排序
* @throws SQLException SQL异常
*/
// 预期的结果应该如图所示
// +----+--------+------+
Expand All @@ -132,7 +169,21 @@ public String toString() {
// | 3 | goods3 | 20 |
// +----+--------+------+
public static List<GoodsAndGmv> getGoodsAndGmv(Connection databaseConnection) throws SQLException {
return null;
try (PreparedStatement statement = databaseConnection.prepareStatement("select \"ORDER\".GOODS_ID as ID, GOODS.NAME, " +
"sum(GOODS_NUM * GOODS_PRICE) as GMV\n" +
"from \"ORDER\"\n" +
" join GOODS on \"ORDER\".GOODS_ID = GOODS.ID group by \"ORDER\".GOODS_ID order by GMV desc")) {
ResultSet resultSet = statement.executeQuery();
List<GoodsAndGmv> goodsAndGmvs = new ArrayList<>();
while (resultSet.next()) {
GoodsAndGmv goodsAndGmv = new GoodsAndGmv();
goodsAndGmv.goodsId = resultSet.getInt(1);
goodsAndGmv.goodsName = resultSet.getString(2);
goodsAndGmv.gmv = resultSet.getBigDecimal(3);
goodsAndGmvs.add(goodsAndGmv);
}
return goodsAndGmvs;
}
}


Expand All @@ -152,6 +203,10 @@ public String toString() {
/**
* 题目4:
* 查询订单信息,只查询用户名、商品名齐全的订单,即INNER JOIN方式
*
* @param databaseConnection 数据库连接
* @return 查询订单信息,只查询用户名、商品名齐全的订单
* @throws SQLException SQL异常
*/
// 预期的结果为:
// +----------+-----------+------------+-------------+
Expand All @@ -170,12 +225,24 @@ public String toString() {
// | 6 | zhangsan | goods3 | 20 |
// +----------+-----------+------------+-------------+
public static List<Order> getInnerJoinOrders(Connection databaseConnection) throws SQLException {
return null;
String sql = "select \"ORDER\".USER_ID as order_id,\n" +
" USER.NAME as user_name,\n" +
" GOODS.NAME as goods_name,\n" +
" (\"ORDER\".GOODS_NUM * \"ORDER\".GOODS_PRICE) as total_price\n" +
"from \"ORDER\"\n" +
" join GOODS on \"ORDER\".GOODS_ID = GOODS.ID\n" +
" join USER on \"ORDER\".USER_ID = USER.ID";
return getJoinOrders(databaseConnection, sql);

}

/**
* 题目5:
* 查询所有订单信息,哪怕它的用户名、商品名缺失,即LEFT JOIN方式
*
* @param databaseConnection 数据库连接
* @return 查询所有订单信息,哪怕它的用户名、商品名缺失
* @throws SQLException SQL异常
*/
// 预期的结果为:
// +----------+-----------+------------+-------------+
Expand All @@ -185,7 +252,7 @@ public static List<Order> getInnerJoinOrders(Connection databaseConnection) thro
// +----------+-----------+------------+-------------+
// | 2 | lisi | goods1 | 10 |
// +----------+-----------+------------+-------------+
// | 3 | wangwu | goods1 | 20 |
// | 3 | lisi | goods1 | 20 |
// +----------+-----------+------------+-------------+
// | 4 | zhangsan | goods2 | 80 |
// +----------+-----------+------------+-------------+
Expand All @@ -198,10 +265,30 @@ public static List<Order> getInnerJoinOrders(Connection databaseConnection) thro
// | 8 | NULL | NULL | 60 |
// +----------+-----------+------------+-------------+
public static List<Order> getLeftJoinOrders(Connection databaseConnection) throws SQLException {
return null;
String sql = "select \"ORDER\".USER_ID as Order_id, USER.NAME as user_name, GOODS.NAME as goods_name, (\"ORDER\".GOODS_NUM * \"ORDER\".GOODS_PRICE) as total_price\n" +
"from \"ORDER\"\n" +
" left join GOODS on \"ORDER\".GOODS_ID = goods.id\n" +
" left join USER on \"ORDER\".USER_ID = USER.ID";
return getJoinOrders(databaseConnection, sql);
}

// 注意,运行这个方法之前,请先运行mvn initialize把测试数据灌入数据库

public static List<Order> getJoinOrders(Connection databaseConnection, String sql) throws SQLException {
try (PreparedStatement statement = databaseConnection.prepareStatement(sql)) {
ResultSet resultSet = statement.executeQuery();
List<Order> orders = new ArrayList<>();
while (resultSet.next()) {
Order order = new Order();
order.id = resultSet.getInt(1);
order.userName = resultSet.getString(2);
order.goodsName = resultSet.getString(3);
order.totalPrice = resultSet.getBigDecimal(4);
orders.add(order);
}
return orders;
}
}

public static void main(String[] args) throws SQLException {
File projectDir = new File(System.getProperty("basedir", System.getProperty("user.dir")));
String jdbcUrl = "jdbc:h2:file:" + new File(projectDir, "target/test").getAbsolutePath();
Expand Down