练习36-39:窗口函数,聚合查询,子查询

四张表信息

在这里插入图片描述

36. 查询每门科目成绩最好的前两名,允许出现并列的名次

第一步:看到排名,且允许名次并列,很容易想到窗口函数dense_rank()

 SELECT 
 *,
 dense_rank() over (PARTITION BY cid ORDER BY score DESC) AS rk
 FROM sc;

在这里插入图片描述

第二步:选出rk <= 2的即可

 SELECT 
 *,
 rk
 FROM(
	 SELECT 
	 *,
	 dense_rank() over (PARTITION BY cid ORDER BY score DESC) AS rk
	 FROM sc
 ) a
 WHERE rk <= 2;

在这里插入图片描述

37. 统计每门课程的学生选修人数(超过5人的课程才统计)

简单分组聚合查询

 SELECT
 cid,
 COUNT(*) AS ct
 FROM sc
 GROUP BY cid
 HAVING ct > 5;

在这里插入图片描述

38. 检索至少选修两门课程的学生学号

第一步: 按学生编号进行分组,去重聚合课程数量

 SELECT
 sid,
 COUNT(DISTINCT cid)
 FROM sc
 GROUP BY sid;

在这里插入图片描述

第二步:筛选出选修课程大于两门的,结果只保留学生学号

 SELECT 
 sid
 FROM sc
 GROUP BY sid
 HAVING COUNT(DISTINCT cid) >= 2;

在这里插入图片描述

39. 查询选修了全部课程的学生信息

第一步:锁定表,课程表,成绩表,学生表
第二步:查询课程总数

 SELECT
 COUNT(*) AS ct
 FROM course;

在这里插入图片描述

第三步:查询每个学生所学课程的去重总数,筛出数量和总课程数相等的学生id

 SELECT
 sid
 FROM sc
 GROUP BY sid
 HAVING COUNT(DISTINCT cid) = (SELECT COUNT(*) AS ct FROM course);

在这里插入图片描述

第四步:关联学生表,或者用in作为子查询查出学生信息
关联学生表写法

 SELECT
 b.*
 FROM (
	 SELECT
	 sid
	 FROM sc
	 GROUP BY sid
	 HAVING COUNT(DISTINCT cid) = (SELECT COUNT(*) AS ct FROM course)
 ) a
 JOIN student b
 ON a.sid = b.sid;

在这里插入图片描述

子查询写法

 SELECT
 * 
 FROM student
 WHERE sid IN (
	SELECT
	 sid
	 FROM sc
	 GROUP BY sid
	 HAVING COUNT(DISTINCT cid) = (SELECT COUNT(*) AS ct FROM course)
 );

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值