一、数据
二、问题
查询各科成绩前两名的记录
三、思路
思路1:手动分组,分别将每门课程的前两名记录查询出来,再将数据拼接。
(select * from score s1 where 课程号=0001 order by 成绩 desc limit 2)
union
(select * from score s1 where 课程号=0002 order by 成绩 desc limit 2)
union
(select * from score s1 where 课程号=0003 order by 成绩 desc limit 2) ;
思路2:使用关联子查询。
表中每条数据都遍历一遍,只要符合:跟它同科目的所有成绩相比(包括自己),排名在前两名
,该条数据就应该被显示。
跟它同科目的所有成绩相比(包括自己),排名在前两名
可以翻译为:同一科目下的所有记录形成的集合,最多只有一个成绩比它大,另一个就是它本身。count(满足条件的记录)<2
SELECT *
FROM score (外)
WHERE 该数据在同一课程组下,组中成绩(外)大于本条成绩(内)的记录的条数 <2
SELECT *
FROM score
WHERE (select count(*) from score where 外表.课程号=内表.课程号 AND 内表.成绩<外表.成绩) <2
外表.课程号=内表.课程号
用于分组
外表.成绩<内表.成绩
用于寻找排名的条件
SELECT *
FROM score a
WHERE ( SELECT COUNT( * ) FROM score b WHERE a.课程号 = b.课程号 AND a.成绩 < b.成绩 ) <2
ORDER BY a.课程号, a.成绩 DESC ;#排序便于观察