生成数据表
create table score (
s_id varchar(10),
c_id varchar(10),
score varchar(10)
);
insert into score (s_id, c_id, score)
values ('01' , '01' , 80),
('01' , '02' , 90),
('01' , '03' , 99),
('02' , '01' , 70),
('02' , '02' , 60),
('02' , '03' , 80),
('03' , '01' , 80),
('03' , '02' , 80),
('03' , '03' , 80),
('04' , '01' , 50),
('04' , '02' , 30),
('04' , '03' , 20),
('05' , '01' , 76),
('05' , '02' , 87),
('06' , '01' , 31),
('06' , '03' , 34),
('07' , '02' , 89),
('07' , '03' , 98);
select * from score;
查询每门课成绩最好的两个同学
关联子查询
对于外部查询返回的每一行数据,内部查询都要执行一次。在关联子查询中是信息流是双向的。外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录。然后,外部查询根据返回的记录做出决策。
sc1每次传入一个score去与sc2的每个score比较,括号外小于3是限制条件,与下面的group by一起作用,即每个课程只能有两个score且是前两名同学的分数,这样每组就选出了前两名
select * from score sc1
where (select count(*) from score sc2 where sc2.c_id = sc1.c_id and sc2.score >= sc1.score)<3
order by sc1.c_id , sc1.score desc ;