Skip to content
Open

test #205

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
199 changes: 78 additions & 121 deletions src/main/java/com/github/hcsp/sql/Sql.java
Original file line number Diff line number Diff line change
@@ -1,60 +1,13 @@

package com.github.hcsp.sql;

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

public class Sql {
// 用户表:
// +----+----------+------+----------+
// | ID | NAME | TEL | ADDRESS |
// +----+----------+------+----------+
// | 1 | zhangsan | tel1 | beijing |
// +----+----------+------+----------+
// | 2 | lisi | tel2 | shanghai |
// +----+----------+------+----------+
// | 3 | wangwu | tel3 | shanghai |
// +----+----------+------+----------+
// | 4 | zhangsan | tel4 | shenzhen |
// +----+----------+------+----------+
// 商品表:
// +----+--------+-------+
// | ID | NAME | PRICE |
// +----+--------+-------+
// | 1 | goods1 | 10 |
// +----+--------+-------+
// | 2 | goods2 | 20 |
// +----+--------+-------+
// | 3 | goods3 | 30 |
// +----+--------+-------+
// | 4 | goods4 | 40 |
// +----+--------+-------+
// | 5 | goods5 | 50 |
// +----+--------+-------+
// 订单表:
// +------------+-----------------+------------------+---------------------+-------------------------------+
// | ID(订单ID) | USER_ID(用户ID) | GOODS_ID(商品ID) | GOODS_NUM(商品数量) | GOODS_PRICE(下单时的商品单价) |
// +------------+-----------------+------------------+---------------------+-------------------------------+
// | 1 | 1 | 1 | 5 | 10 |
// +------------+-----------------+------------------+---------------------+-------------------------------+
// | 2 | 2 | 1 | 1 | 10 |
// +------------+-----------------+------------------+---------------------+-------------------------------+
// | 3 | 2 | 1 | 2 | 10 |
// +------------+-----------------+------------------+---------------------+-------------------------------+
// | 4 | 4 | 2 | 4 | 20 |
// +------------+-----------------+------------------+---------------------+-------------------------------+
// | 5 | 4 | 2 | 100 | 20 |
// +------------+-----------------+------------------+---------------------+-------------------------------+
// | 6 | 4 | 3 | 1 | 20 |
// +------------+-----------------+------------------+---------------------+-------------------------------+
// | 7 | 5 | 4 | 1 | 20 |
// +------------+-----------------+------------------+---------------------+-------------------------------+
// | 8 | 5 | 6 | 1 | 60 |
// +------------+-----------------+------------------+---------------------+-------------------------------+

// 用户信息
public static class User {
Integer id;
Expand All @@ -75,21 +28,24 @@ public String toString() {
* @param goodsId 指定的商品ID
* @return 有多少用户买过这个商品
*/
// 例如,输入goodsId = 1,返回2,因为有2个用户曾经买过商品1。
// +-----+
// |count|
// +-----+
// | 2 |
// +-----+

public static int countUsersWhoHaveBoughtGoods(Connection databaseConnection, Integer goodsId) throws SQLException {
PreparedStatement ps = databaseConnection.prepareStatement("select count(distinct USER_ID)\n" +
"from \"ORDER\"\n" +
"where GOODS_ID = ?;");
ps.setInt(1, goodsId);
ResultSet resultSet = ps.executeQuery();
if (resultSet.next()) {
return resultSet.getInt(1);
}
return 0;
}

/**
* 题目2:
* 分页查询所有用户,按照ID倒序排列
*
* @param pageNum 第几页,从1开始
* @param pageNum 第几页,从1开始
* @param pageSize 每页有多少个元素
* @return 指定页中的用户
*/
Expand All @@ -100,7 +56,22 @@ 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;
List<User> users = new ArrayList<>();
PreparedStatement ps = databaseConnection.prepareStatement("select id, name, tel, address from USER order by ID desc limit ?, ?;");
int searchStartIndex = (pageNum - 1) * pageSize;
int searchEndIndex = searchStartIndex + pageNum;
ps.setInt(1, searchStartIndex);
ps.setInt(2, searchEndIndex);
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()) {
User user = new User();
user.id = resultSet.getInt("ID");
user.name = resultSet.getString("NAME");
user.tel = resultSet.getString("TEL");
user.address = resultSet.getString("ADDRESS");
users.add(user);
}
return users;
}

// 商品及其营收
Expand All @@ -119,20 +90,22 @@ public String toString() {
* 题目3:
* 查询所有的商品及其销售额,按照销售额从大到小排序
*/
// 预期的结果应该如图所示
// +----+--------+------+
// | ID | NAME | GMV |
// +----+--------+------+
// | 2 | goods2 | 2080 |
// +----+--------+------+
// | 1 | goods1 | 80 |
// +----+--------+------+
// | 4 | goods4 | 20 |
// +----+--------+------+
// | 3 | goods3 | 20 |
// +----+--------+------+
public static List<GoodsAndGmv> getGoodsAndGmv(Connection databaseConnection) throws SQLException {
return null;
List<GoodsAndGmv> goodsAndGmvs = new ArrayList<>();
PreparedStatement ps = databaseConnection.prepareStatement("select G2.ID,G2.NAME, sum(GOODS_PRICE * GOODS_NUM) as GMV\n"
+ "from \"ORDER\"\n"
+ "join GOODS G2 on G2.ID = \"ORDER\".GOODS_ID\n"
+ "group by GOODS_ID\n"
+ "order by GMV desc ;");
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()) {
GoodsAndGmv goodsAndGmv = new GoodsAndGmv();
goodsAndGmv.gmv = resultSet.getBigDecimal("GMV");
goodsAndGmv.goodsId = resultSet.getInt("ID");
goodsAndGmv.goodsName = resultSet.getString("NAME");
goodsAndGmvs.add(goodsAndGmv);
}
return goodsAndGmvs;
}


Expand All @@ -153,65 +126,49 @@ public String toString() {
* 题目4:
* 查询订单信息,只查询用户名、商品名齐全的订单,即INNER JOIN方式
*/
// 预期的结果为:
// +----------+-----------+------------+-------------+
// | ORDER_ID | USER_NAME | GOODS_NAME | TOTAL_PRICE |
// +----------+-----------+------------+-------------+
// | 1 | zhangsan | goods1 | 50 |
// +----------+-----------+------------+-------------+
// | 2 | lisi | goods1 | 10 |
// +----------+-----------+------------+-------------+
// | 3 | lisi | goods1 | 20 |
// +----------+-----------+------------+-------------+
// | 4 | zhangsan | goods2 | 80 |
// +----------+-----------+------------+-------------+
// | 5 | zhangsan | goods2 | 2000 |
// +----------+-----------+------------+-------------+
// | 6 | zhangsan | goods3 | 20 |
// +----------+-----------+------------+-------------+

public static List<Order> getInnerJoinOrders(Connection databaseConnection) throws SQLException {
return null;
List<Order> orders = new ArrayList<>();
ResultSet resultSet = databaseConnection.createStatement().executeQuery("select \"ORDER\".ID as ORDER_ID,\n" +
" U.NAME as USER_NAME,\n" +
" G2.NAME as GOODS_NAME,\n" +
" \"ORDER\".GOODS_NUM * GOODS_PRICE as TOTAL_PRICE\n" +
"from \"ORDER\"\n" +
" join USER U on U.ID = \"ORDER\".USER_ID\n" +
" join GOODS G2 on G2.ID = \"ORDER\".GOODS_ID");

return getOrders((List<Order>) orders, resultSet);
}

private static List<Order> getOrders(List<Order> orders, ResultSet resultSet) throws SQLException {
while (resultSet.next()) {
Order order = new Order();
order.goodsName = resultSet.getString("GOODS_NAME");
order.userName = resultSet.getString("USER_NAME");
order.id = resultSet.getInt("ORDER_ID");
order.totalPrice = resultSet.getBigDecimal("TOTAL_PRICE");
orders.add(order);
}
return orders;
}

/**
* 题目5:
* 查询所有订单信息,哪怕它的用户名、商品名缺失,即LEFT JOIN方式
*/
// 预期的结果为:
// +----------+-----------+------------+-------------+
// | ORDER_ID | USER_NAME | GOODS_NAME | TOTAL_PRICE |
// +----------+-----------+------------+-------------+
// | 1 | zhangsan | goods1 | 50 |
// +----------+-----------+------------+-------------+
// | 2 | lisi | goods1 | 10 |
// +----------+-----------+------------+-------------+
// | 3 | lisi | goods1 | 20 |
// +----------+-----------+------------+-------------+
// | 4 | zhangsan | goods2 | 80 |
// +----------+-----------+------------+-------------+
// | 5 | zhangsan | goods2 | 2000 |
// +----------+-----------+------------+-------------+
// | 6 | zhangsan | goods3 | 20 |
// +----------+-----------+------------+-------------+
// | 7 | NULL | goods4 | 20 |
// +----------+-----------+------------+-------------+
// | 8 | NULL | NULL | 60 |
// +----------+-----------+------------+-------------+

public static List<Order> getLeftJoinOrders(Connection databaseConnection) throws SQLException {
return null;
List<Order> orders = new ArrayList<>();
ResultSet resultSet = databaseConnection.createStatement().executeQuery("select \"ORDER\".ID as ORDER_ID,\n" +
" U.NAME as USER_NAME,\n" +
" G2.NAME as GOODS_NAME,\n" +
" \"ORDER\".GOODS_NUM * GOODS_PRICE as TOTAL_PRICE\n" +
"from \"ORDER\"\n" +
" left join USER U on U.ID = \"ORDER\".USER_ID\n" +
" left join GOODS G2 on G2.ID = \"ORDER\".GOODS_ID");

return getOrders((List<Order>) orders, resultSet);
}

// 注意,运行这个方法之前,请先运行mvn initialize把测试数据灌入数据库
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();
try (Connection connection = DriverManager.getConnection(jdbcUrl, "root", "Jxi1Oxc92qSj")) {
System.out.println(countUsersWhoHaveBoughtGoods(connection, 1));
System.out.println(getUsersByPageOrderedByIdDesc(connection, 2, 3));
System.out.println(getGoodsAndGmv(connection));
System.out.println(getInnerJoinOrders(connection));
System.out.println(getLeftJoinOrders(connection));
}
}

}