练习7:去重聚合、子查询作为having条件、关联查询

本文介绍如何通过SQL查询未学全所有课程的学生信息。首先确定总课程数,然后找出成绩记录中的学生及其所学课程数量,筛选出所学课程少于总数的学生,并最终获取这些学生的详细资料。

7. 查询没有学全所有课程的学生信息(成绩表中没有记录的学生不考虑)

关键词分析: 没有学全、所有课程、学生信息
第一步: 锁定表,我们发现需要查询三张表。
在这里插入图片描述
第二步: 从课程表查出一共有几门课程

SELECT COUNT(DISTINCT Cid) FROM course;

在这里插入图片描述

第三步: 某门课程有成绩表示学生选了该门课,所以从成绩表看有成绩的科目数小于总课程数的有哪些学生

SELECT sid,COUNT(Cid) ct FROM SC 
GROUP BY sid
HAVING ct < (SELECT COUNT(DISTINCT cid) FROM course);

在这里插入图片描述

第四步: 从学生表中查出这几个学生的详细信息

SELECT 
  st.*,
  s.ct 
FROM
  student st 
  JOIN 
    (SELECT sid,COUNT(Cid) ct FROM SC 
    GROUP BY sid 
    HAVING ct < (SELECT COUNT(DISTINCT cid) FROM course)) s 
   ON st.`SId` = s.sid ;

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值