用SQL语言查询班上前5名学生成绩

上周有客户问我,如何查看数据库中前五名的点?我解释了三种不同的方法,每种方法都非常有趣。

我们先来谈谈SQL Server。
它使用 TOP 关键字,简单明了。
例如,这样写:SELECT 5 BALLS FROM STUDENTS ORDER BY points DESC。
这里的“学生”是学生信息表,成绩用“分”来表示。
本次调查问卷将查找成绩最高的前五名学生的信息。

然后是MySQL,它更简单,使用LIMIT关键字。
像这样: SELECT FROM STUDENTS ORDER BY 子句 CONSTRAINT 5 . 这种语法一看就很容易理解。
首先按成绩降序排序,然后只获取前 5 条记录。

我们来谈谈Oracle,它有点复杂,你应该使用ROWNUM。
必须先写一个子查询,然后在子查询外添加WHERE条件来限制行数。
代码是这样的: SELECT FROM (SELECT FROM Students ORDER BY result DESC) WHERE ROWNUM <= 5 Oracle的ROWNUM是按照查询顺序自动排序的,所以这样可以保证只检索前五项。

这三种方法各有特点,但目标是相同的,都是找出成绩最好的五个学生。
不过,不同的数据库管理系统可能还有其他的技术,比如窗口函数等。

我告诉嘉宾,掌握这些查询技巧对于数据库管理和数据分析很重要。
不过,在使用这些问题时,还应该注意数据安全和隐私保护,防止未经授权的人看到不该看到的东西。

反正就看你了,这些方法还是挺实用的。
我还在想,如果有一天数据库的数据量更大了,这些查询语句是不是能够这么快找到答案呢?

图解SQL面试题:经典topN问题

我记得当我帮室友修改大学论文时,他写错了一半的SQL代码,数据库冻结了两个小时。

这个查询其实很有趣。
如果你看这个row_number(),它会将每个学生的分数从高到低排名,那么外部查询将直接获得小于或等于2 的排名。
如果使用dense_rank()会发生什么?并列第一和第二的选手会被分在同一组吗?
等等,我突然想到,如果成绩单上只有语文和数学的话,这个查询的结果就很清楚了。
但如果有二十个科目怎么办?前两个是语文和数学吗?是不是有点重复了?
最烦人的是,有位老师用这个查询来统计期末考试各科得分最高的前两名。
事实证明物理和化学仍然被扫荡,最终他使用了 Rank() 代替。

现在问题来了:如果一个学生有重修课程的记录,那么这个查询是否也包括重修成绩呢?