sql如何查询所有学生都选修了的课程的课程号cno?

这个问题是我最近作业遇见的,当时想了挺久的,发现不会,然后去网上搜索了也有蛮久的,但是就是没搜到和我这个类似的,就算有我也有点看不懂或者和我要求的不一样,最后我还是通过对我的需求(其实就是EXISTS和NOT EXISTS)进行相关的查阅和了解最终还是把这个题解决了,至于到底对不对,我有进行比较多次的分析和实例的测试,应该是没有问题的,那么首先看题:

思考:如何查询所有学生都选修了的课程的课程号cno?

其中表分别为course sc student
表中的具体数值如下(使用的软件为navicat不是说一定需要用这个软件,sql语句大多是通的,但是不同软件的话可能会有一定的小出入)
以下分别是course表、sc表、student表
course表
在这里插入图片描述
在这里插入图片描述

语句:select cno from course where NOT EXISTS(select *from student where NOT EXISTS(select *from sc B where B.sno = student.sno and course.cno = B.cno));

分析:

*首先从课程表里面选出一个课程,然后再从学生表里面取出所有的学生,然后进行B.sno = student.sno and course.cno = B.cno的判断来确定该名学生有没有选这门课,如果有则查询到了结果则第二个NOT EXISTS 返回false则student里面的where则接受到false不进行任何操作,即为空,如果没有查询到结果则第二个NOT EXISTS返回true则将结果放到结果表里面,结果表不为空则第一个NOT EXISTS返回false输出结果表最终为空,而当且仅当满足所有的B.sno = student.sno and course.cno = B.cno情况下第二个NOT EXISTS返回的都是false则select from student 产生的结果表整体为空,此时再遇到第一个NOT EXISTS 则返回true,这是将结果放到最终输出表上,即为所求。

在这里插入图片描述

由于总共有五个学生其中95005学号的学生没有选课,所以最后的结果输出肯定为空,但是输出为空的可能性会有很多,所以为了验证语句的正确性,我们给95005也设置一门课程号为2的选修,那么语句查询 的结果应该为2结果图如下
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

和预期的结果一致,所以语句应该是正确的
如果存在有思路不太能看懂的话可以参考一下这一篇来自小绵杨Yancy的博客
https://blog.csdn.net/ZHANGYANG_1109/article/details/116977882?spm=1001.2014.3001.5506
最后如果本题的思路或者答案存在什么问题的话,还请指正。谢谢

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值