一个数据查询的题…..

img


查询出没有选修课程的学生姓名,请用子查询实现

img


这个是答案,有点看不太懂,求解释

问题:查询出没有选修课程的学生姓名
1、先查询出选课表中已选课的学生学号

select distinct son from SC

2、查询学生表中学生学号没在子查询中的记录,即为没选修课程的学生

select sname from S where sno not in (
  select distinct son from SC 
)

select sname from s where sno not in (select distinct sno from s left join sc on s.sno=sc.sno left join c on sc.cno=c.cno );

这样我先给你分析下子查询的结果集


select distinct sno from S

查询出的结果是从学生表中查询所有学生的学号,但不能有重复的。
可以理解吧,distinct修饰了学号。
它的结果是一个sno的列表。
也就是一个集合。
前面再来看。


select sname from S where S.sno not in [集合列表]

也就是查询处这个学生没有在这个集合里的。
但从题目给的要求是选课,所以你给的答案其实是有误的。
应该把子查询里的S表改成SC。

让查跟选课有关的数据,而select里面却根本没有用到SC,一看就是错的

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632