刚学完SQL基础语法,却不知道怎么下手实战?光看教程不练手,遇到真实问题还是不会写查询。其实最好的学习方式就是“边做边改”,找几个贴近实际场景的小项目来练,比刷十道理论题都管用。
1. 学生成绩管理系统
这个项目模拟一个班级的成绩记录场景。你可以建三张表:学生表(student)、课程表(course)、成绩表(score)。试着查出每个学生的平均分、找出挂科超过两门的学生、或者统计每门课的最高分。
比如,想查出平均分高于80的学生姓名:
SELECT s.name, AVG(sc.score) as avg_score
FROM student s
JOIN score sc ON s.id = sc.student_id
GROUP BY s.id, s.name
HAVING AVG(sc.score) > 80;
2. 网店订单数据分析
假设你朋友开了个小网店,想分析销售数据。你可以设计用户表(users)、订单表(orders)、商品表(products)。然后练习一些常见业务查询,比如:上个月销量最高的商品、复购率高的客户、客单价分布。
查出上个月销售额前五的商品:
SELECT p.name, SUM(o.amount) as total_sales
FROM products p
JOIN orders o ON p.id = o.product_id
WHERE o.order_date BETWEEN '2024-06-01' AND '2024-06-30'
GROUP BY p.id, p.name
ORDER BY total_sales DESC
LIMIT 5;
3. 图书馆借阅系统
建个图书管理的小系统,包含图书表、读者表、借阅记录表。可以查哪些书被借得最多,哪些读者长期未还书,或者统计每月借阅量变化。
找出当前逾期未还的读者和书名:
SELECT r.name, b.title, l.borrow_date, l.due_date
FROM lending l
JOIN readers r ON l.reader_id = r.id
JOIN books b ON l.book_id = b.id
WHERE l.return_date IS NULL AND l.due_date < CURRENT_DATE;
4. 员工与部门信息查询
这是经典的多表关联场景。有员工表(employee)和部门表(department),练习按部门统计人数、找出工资高于部门平均值的员工、或者查出没有员工的空闲部门。
查出每个部门中工资排前三的员工:
SELECT dept_name, name, salary
FROM (
SELECT d.name as dept_name, e.name, e.salary,
ROW_NUMBER() OVER (PARTITION BY e.dept_id ORDER BY e.salary DESC) as rn
FROM employee e
JOIN department d ON e.dept_id = d.id
) t
WHERE rn <= 3;
5. 博客文章与评论分析
做一个简单的博客系统后台,包含文章表(posts)、评论表(comments)。可以统计每篇文章的评论数、找出最活跃的评论用户、或者筛选出没有评论的“冷门”文章。
列出评论数最多的五篇文章标题:
SELECT p.title, COUNT(c.id) as comment_count
FROM posts p
LEFT JOIN comments c ON p.id = c.post_id
GROUP BY p.id, p.title
ORDER BY comment_count DESC
LIMIT 5;
这些项目不需要真的上线运行,本地用SQLite或MySQL搭个环境就能玩起来。数据可以自己编几十条,重点是写出能解决问题的SQL语句。做多了就会发现,很多公司面试题其实就来自这些日常场景。
别等“完全学会”再动手,边查文档边写才是真实工作状态。哪怕一开始写的SQL又长又慢,改几次就顺了。