一、基础查询(1-10题)
1. 查询所有用户的全部字段
SELECT * FROM user;
2. 查询所有用户的姓名、年龄、城市
SELECT name, age, city FROM user;
3. 查询年龄大于28岁的用户姓名和年龄
SELECT name, age FROM user WHERE age > 28;
4. 查询城市是“成都”的用户
SELECT * FROM user WHERE city = '成都';
5. 查询年龄在25到35岁之间的用户
SELECT * FROM user WHERE age BETWEEN 25 AND 35;
或
SELECT * FROM user WHERE age >= 25 AND age <= 35;
6. 查询名字里带“小”的用户
SELECT * FROM user WHERE name LIKE '%小%';
(会查到:王小二、张小三、孙小美、陈小春)
7. 查询手机号以“139”开头的用户
SELECT * FROM user WHERE phone LIKE '139%';
(会查到:张三、李大嘴)
8. 查询没有手机号的用户
SELECT * FROM user WHERE phone IS NULL;
(数据里所有人都有手机号,所以返回空)
9. 查询城市是“成都”或“北京”的用户
SELECT * FROM user WHERE city = '成都' OR city = '北京';
或
SELECT * FROM user WHERE city IN ('成都', '北京');
10. 查询年龄最大的3个人
SELECT * FROM user ORDER BY age DESC LIMIT 3;
(会查到:钱多多45岁、陈小春41岁、刘大拿38岁)
二、统计与分组(11-15题)
11. 统计总共有多少个用户
SELECT COUNT(*) FROM user;
(结果:15)
12. 统计每个城市各有多少人
SELECT city, COUNT(*) AS 人数
FROM user
GROUP BY city;
(结果:成都5人、北京2人、上海2人、广州1人、深圳1人、重庆1人、西安1人、香港1人)
13. 统计每个城市的平均年龄
SELECT city, AVG(age) AS 平均年龄
FROM user
GROUP BY city;
14. 找出人数大于等于3个的城市
SELECT city, COUNT(*) AS 人数
FROM user
GROUP BY city
HAVING 人数 >= 3;
(结果:成都5人)
15. 统计年龄大于25岁的各城市人数
SELECT city, COUNT(*) AS 人数
FROM user
WHERE age > 25
GROUP BY city;
三、排序与分页(16-18题)
16. 查询所有用户,按年龄从大到小排序
SELECT * FROM user ORDER BY age DESC;
17. 查询所有用户,按城市排序,同一个城市的按年龄从小到大排序
SELECT * FROM user ORDER BY city, age ASC;
18. 分页查询:第2页的数据,每页5条(即第6-10条)
SELECT * FROM user LIMIT 5, 5;
或
SELECT * FROM user LIMIT 5 OFFSET 5;
四、多表查询(19-25题)
19. 查询所有用户的姓名和他们的订单金额
SELECT user.name, orders.amount
FROM user
JOIN orders ON user.id = orders.user_id;
(会显示所有有订单的记录,每人可能有多条)
20. 查询所有用户的姓名和他们的订单总金额
SELECT user.name, SUM(orders.amount) AS 总金额
FROM user
LEFT JOIN orders ON user.id = orders.user_id
GROUP BY user.id;
(使用LEFT JOIN才能显示没有订单的用户,他们的总金额为NULL)
21. 查询所有下单过的用户姓名(有订单记录的用户)
SELECT DISTINCT user.name
FROM user
JOIN orders ON user.id = orders.user_id;
或
SELECT name FROM user WHERE id IN (SELECT DISTINCT user_id FROM orders);
22. 查询从未下过单的用户姓名
SELECT name
FROM user
LEFT JOIN orders ON user.id = orders.user_id
WHERE orders.id IS NULL;
(会查到:陈小春,因为他没有订单)
23. 查询订单金额大于1000的用户姓名和订单金额
SELECT user.name, orders.amount
FROM user
JOIN orders ON user.id = orders.user_id
WHERE orders.amount > 1000;
(会查到:张三的1599、赵六的2599和1299、钱多多的3299、张小三的1299等)
24. 查询订单数量最多的前3个用户(显示用户姓名和订单数量)
SELECT user.name, COUNT(orders.id) AS 订单数量
FROM user
JOIN orders ON user.id = orders.user_id
GROUP BY user.id
ORDER BY 订单数量 DESC
LIMIT 3;
(赵六有3个订单,排名第一;张三名列第二)
25. 查询每个用户的订单数量(包括没有订单的用户,显示0)
SELECT user.name, COUNT(orders.id) AS 订单数量
FROM user
LEFT JOIN orders ON user.id = orders.user_id
GROUP BY user.id;
五、综合应用题(26-30题)
26. 查询成都用户的平均年龄
SELECT AVG(age) AS 成都平均年龄
FROM user
WHERE city = '成都';
27. 查询名字里带“张”的用户,并显示他们有没有下过单(有就显示订单金额,没有就显示“无订单”)
SELECT DISTINCT user.name,
IF(orders.id IS NULL, '无订单', '有订单') AS 订单状态
FROM user
LEFT JOIN orders ON user.id = orders.user_id
WHERE user.name LIKE '%张%';
(张三、张小三都有订单)
28. 查询所有订单,显示订单金额,并标注是“大额订单”(>1000)还是“普通订单”
SELECT id, amount,
CASE WHEN amount > 1000 THEN '大额订单'
ELSE '普通订单' END AS 订单类型
FROM orders;
29. 查询2024年3月1日之后下的订单
SELECT * FROM orders
WHERE order_date > '2024-03-01';
或更精确:
SELECT * FROM orders
WHERE DATE(order_date) > '2024-03-01';
30. 查询所有用户,显示姓名、年龄,以及年龄分组(小于25岁显示“青年”,25-35岁显示“中年”,大于35岁显示“壮年”)
SELECT name, age,
CASE WHEN age < 25 THEN '青年'
WHEN age BETWEEN 25 AND 35 THEN '中年'
ELSE '壮年' END AS 年龄段
FROM user;
附加挑战题答案(选做)
31. 查询每个城市消费总额最高的用户(每个城市取消费金额最高的那个人)
SELECT u.city, u.name, SUM(o.amount) AS 总消费
FROM user u
JOIN orders o ON u.id = o.user_id
GROUP BY u.id
HAVING SUM(o.amount) = (
SELECT MAX(总消费)
FROM (
SELECT u2.city, SUM(o2.amount) AS 总消费
FROM user u2
JOIN orders o2 ON u2.id = o2.user_id
GROUP BY u2.id
) AS city_max
WHERE city_max.city = u.city
);
(这个比较难,能写出来很加分)
32. 查询每个用户的消费金额排名(按金额从高到低)
SELECT u.name, SUM(o.amount) AS 总消费,
RANK() OVER (ORDER BY SUM(o.amount) DESC) AS 排名
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id;
(需要MySQL 8.0+,支持窗口函数)
33. 查询比“张三”年龄大的用户
SELECT * FROM user
WHERE age > (SELECT age FROM user WHERE name = '张三');
(张三25岁,所以查到所有大于25岁的用户)
验证数据是否正确的小技巧
执行这个SQL可以快速核对你的数据:
-- 查看所有用户及其订单数量
SELECT u.id, u.name, u.age, u.city, COUNT(o.id) AS 订单数
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id
ORDER BY u.id;
你的数据中:
- 用户ID 1-15 都有数据
- 用户ID 15(陈小春)没有订单
- 用户ID 4(赵六)有3个订单,是最多的
发表回复