MySQL提高 | 关联子查询 | 查询每门课成绩最好的两个同学

生成数据表

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 ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值