MySQL实操30题(答案版)


一、基础查询(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个订单,是最多的

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注