mysql查询各科成绩前三名的记录(不考虑成绩并列情况)
封面图
•
2026-01-16
•
MySQL
247
0
0
0
在 MySQL 中,若要查询**各科成绩前三名的记录**(不考虑成绩并列情况),可以使用 **窗口函数 `ROW_NUMBER()`** 来实现。以下是实现该需求的 SQL 查询语句。 --- ### 假设表结构如下: ```sql CREATE TABLE scores ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT, subject VARCHAR(50), score DECIMAL(10, 2) ); ``` --- ### 查询各科成绩前三名的记录(不考虑并列): ```sql SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY subject ORDER BY score DESC) AS rank FROM scores ) AS ranked WHERE rank <= 3; ``` --- ### 说明: - `ROW_NUMBER()`:为每个科目(`subject`)内的成绩按降序排列,生成排名。 - `PARTITION BY subject`:按科目分组。 - `ORDER BY score DESC`:按成绩从高到低排序。 - `rank <= 3`:筛选出每科成绩前3名的记录。 --- ### 示例数据: 假设 `scores` 表中有如下数据: | id | student_id | subject | score | |----|------------|---------|-------| | 1 | 101 | 数学 | 90 | | 2 | 102 | 数学 | 85 | | 3 | 103 | 数学 | 88 | | 4 | 104 | 英语 | 92 | | 5 | 105 | 英语 | 89 | | 6 | 106 | 英语 | 91 | 运行上述查询后,结果会是: | id | student_id | subject | score | rank | |----|------------|---------|-------|------| | 1 | 101 | 数学 | 90 | 1 | | 3 | 103 | 数学 | 88 | 2 | | 2 | 102 | 数学 | 85 | 3 | | 4 | 104 | 英语 | 92 | 1 | | 6 | 106 | 英语 | 91 | 2 | | 5 | 105 | 英语 | 89 | 3 | --- ### 注意事项: - 如果你使用的是 **MySQL 8.0 以下版本**,不支持 `ROW_NUMBER()`,可以用子查询和变量来实现。 - 如果需要考虑成绩并列的情况(比如并列第3名),则应使用 `RANK()` 或 `DENSE_RANK()`,但根据你的要求“不考虑成绩并列情况”,所以 `ROW_NUMBER()` 是最合适的。 --- 如需 MySQL 5.x 的兼容写法,也可以告诉我,我可以提供替代方案。
上一篇:
mysql查询学生平均成绩及其名次
下一篇:
mysql查询每门课程被选修的学生数
标题录入,一次不能超过6条
留言
评论