mysql按各科成绩进行排序,并显示排名
封面图
•
2026-01-17
•
MySQL
270
0
0
0
在 MySQL 中,如果你想要根据各科成绩进行排序并显示排名,可以使用 **窗口函数(Window Function)** 来实现。MySQL 8.0 及以上版本支持窗口函数。 假设你有一个名为 `scores` 的表,结构如下: ```sql CREATE TABLE scores ( id INT PRIMARY KEY AUTO_INCREMENT, student_name VARCHAR(50), subject VARCHAR(50), score INT ); ``` ### 示例数据: ```sql INSERT INTO scores (student_name, subject, score) VALUES ('张三', '数学', 90), ('李四', '数学', 85), ('王五', '数学', 95), ('赵六', '语文', 88), ('孙七', '语文', 92), ('周八', '语文', 80); ``` --- ## ✅ 按科目排序并显示排名 ### 查询语句(按科目分组,每个科目内部按成绩从高到低排序,并显示排名): ```sql SELECT subject, student_name, score, RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS rank FROM scores; ``` ### 输出结果示例: | subject | student_name | score | rank | |---------|--------------|-------|------| | 数学 | 王五 | 95 | 1 | | 数学 | 张三 | 90 | 2 | | 数学 | 李四 | 85 | 3 | | 语文 | 孙七 | 92 | 1 | | 语文 | 赵六 | 88 | 2 | | 语文 | 周八 | 80 | 3 | --- ## 🔍 说明 - `PARTITION BY subject`:按科目分组。 - `ORDER BY score DESC`:按成绩降序排列。 - `RANK()`:表示排名,如果有相同分数会共享相同排名,下一名次会跳过。 - 如果你希望 **不跳过名次**(即连续排名),可以用 `DENSE_RANK()`。 - 如果只需要前几名,可以加 `LIMIT`。 --- ## 📌 扩展:只显示每科前三名 ```sql SELECT * FROM ( SELECT subject, student_name, score, RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS rank FROM scores ) AS ranked WHERE rank <= 3; ``` --- 如果你的 MySQL 版本低于 8.0(比如 5.7 或更早),则无法使用窗口函数,需要通过自连接或变量来实现排名。如果需要这个方法,请告诉我你的 MySQL 版本,我可以提供兼容方案。
上一篇:
MySQL优化
下一篇:
mysql查询学过编号为01的课程并且也学过编号为02的课程的学生的学号、姓名
标题录入,一次不能超过6条
留言
评论