MySQL多表查询实践:学生科目成绩排名与统计

5星 · 超过95%的资源 需积分: 47 5 下载量 54 浏览量 更新于2024-09-03 收藏 117KB DOCX 举报
"该资源提供了一组SQL练习题,旨在帮助学习者掌握在MySQL数据库中进行多表查询的技能。主要包括三个查询任务:1) 查询每个科目成绩最好的两名学生;2) 计算每个学生的总分和平均分;3) 排列数学成绩并显示排名。资料中详细介绍了如何创建和填充数据,包括数据库、学生表和科目分数表的创建,以及数据插入的操作。" 在SQL中,多表查询是数据库操作的核心部分,特别是在处理涉及多个关联表的数据时。在这个资源中,我们有两个关键表格:`student` 和 `grade`。`student` 表用于存储学生的学号、姓名和年龄,而`grade` 表则包含学生的成绩信息,如学号、科目和分数。`grade` 表通过外键 `id` 与 `student` 表的 `id` 进行关联。 对于第一个查询任务,我们需要找出每门课程成绩最好的前两名学生。这通常涉及到使用`JOIN` 来连接两个表,然后使用`GROUP BY` 按科目分组,接着使用`ORDER BY` 对成绩进行降序排序,并利用`LIMIT` 来限制返回的记录数量。例如: ```sql SELECT s.id, s.name, g.kemu, g.score FROM student s JOIN grade g ON s.id = g.id WHERE g.score IN ( SELECT score FROM grade WHERE kemu = g.kemu ORDER BY score DESC LIMIT 2 ) ``` 第二个查询任务要求计算每个学生的总分和平均分。这可以通过再次使用`JOIN`,然后使用`GROUP BY`按学生分组,结合聚合函数`SUM()`和`AVG()`来完成: ```sql SELECT s.id, s.name, g.kemu, g.score, SUM(g.score) AS total_score, AVG(g.score) AS average_score FROM student s JOIN grade g ON s.id = g.id GROUP BY s.id, s.name, g.kemu ``` 最后一个任务是列出数学成绩及其排名。这里可以使用子查询或窗口函数`RANK()`或`DENSE_RANK()`来实现: ```sql SELECT s.id, s.name, g.score, RANK() OVER (ORDER BY g.score DESC) AS ranking FROM student s JOIN grade g ON s.id = g.id WHERE g.kemu = '数学' ``` 以上SQL语句示例展示了如何处理多表查询,计算总分、平均分,以及如何进行排名操作。这些练习对于熟悉和提高SQL查询技巧非常有帮助,特别是对那些正在学习MySQL数据库的初学者来说。通过实践这些查询,学习者可以更好地理解和掌握如何在实际场景中有效地操作和分析数据库中的数据。