查询至少选修了学生201215122选修的全部课程的学生号码(1)

文章讨论了SQL查询中的正确与错误写法,特别是在处理嵌套查询和条件筛选时的区别。错误写法导致数据丢失,而正确方法则能获取至少选修特定课程的学生学号。作者强调理解SQL语句结构和逻辑的重要性。
摘要由CSDN通过智能技术生成
	from tb_SC Z
	where z.Cno=y.Cno and 
	z.Sno=x.Sno and y.Sno='20173824001'
)

)


结果也是错误的。为什么也是错误的呢?我是这样想的。对于正确写法而言,我们最终相当于是在下面这个SQL语句得出的表中匹配结果。



select *
from tb_SC x,tb_SC y,tb_SC z
where z.Cno=y.Cno and
z.Sno=x.Sno


上面的结果得出的表,我截一部分来看看:结果有很多组合!  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190628194422468.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1bGlhbmdrdWFuamlheW91,size_16,color_FFFFFF,t_70)  
 但是按照错误的写法来看,我们就是在这样的SQL语句得出的表中来匹配结果:



select *
from tb_SC x,tb_SC y,tb_SC z
where z.Cno=y.Cno and
z.Sno=x.Sno and y.Sno=‘20173824001’


这个是它的结果:结果相对来说就很少了。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190628194556571.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1bGlhbmdrdWFuamlheW91,size_16,color_FFFFFF,t_70)  
         最后,大家可以看到,写成错误的写法,显然会将有些应该匹配的数据丢失。记得,当你之后回头复习发现还是不会的时候,可以自己把上面的函数去执行一下就可以了,看看结果到底是什么。图片终究是不真实的,自己实际看到的才真实。


        最上面的结果是会返回学生20173824001的,但是我现在要查询的是:至少选修了学生20173824001选修的全部课程的其他学生的学号。



select distinct Sno
from tb_SC x
where not exists
(
select *
from tb_SC y
where y.Sno=‘20173824001’ and not exists
(
select *
from tb_SC Z
where z.Cno=y.Cno and
z.Sno=x.Sno and x.Sno!=‘20173824001’
)
)


        说了很多,其实还是得自己多多理解,这个复杂的SQL语句靠别人是学不会的,的自己理解。加油?


-------------------------------------------------------分割线----------------------------------------------------------  
 以下内容是25 jun 补充:


        



> 
> 查询至少选修了0001号和0002号课程的学生的学号。
> 
> 
> 


一开始遇到这个题目,就想到的使用否定之否定。但是,发现自己写不出来了。欸,只能说自己还是没有掌握吧!为什么说这里可以不用使用否定之否定呢?是因为上面是要我们求“至少选修了学生201215122选修的全部课程的学生号码”,我们并不知道201215122到底选修了什么。但是这题不一样,题目明确说了,就是至少选修了0001和0002号课程的学生。所以,我们使用一个谓词in就可以了。SQL语句如下:



select distinct Sno
from tb_SC
where Sno in(
select x.Sno
from tb_SC x,tb_SC y
where x.Sno=y.Sno and x.Cno=‘0001’ and y.Cno=‘0002’);


如果这里没有加上distinct的话,就会有很多重复的记录,就像这个样子  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019062518142155.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1bGlhbmdrdWFuamlheW91,size_16,color_FFFFFF,t_70)  
 原因很简单,就是因为嵌套查询的原理都是拿出一条元组记录一个一个去比配,满足的话就放到结果集中去。所以,因为选课表是一个学生可能选择多门课,所以,就会有重复的记录了。


        还有为什么要使用自身连接,这个为之前的博客里面有说到过,链接给大家去看啦!<https://blog.csdn.net/suliangkuanjiayou/article/details/93108945>


-------------------------------------------------------------------分割线----------------------------------------------  
 以下内容2.july补充:


        还是之前的老问题,但是我现在发现了一个新的东西。  
 问题:查询选修了所有课程的学生学号。SQL语句如下



select Sno
from tb_Student
where not exists(
select *
from tb_Course
where not exists(
select *
from tb_SC
where tb_SC.Cno=tb_Course.Cno and
tb_SC.Sno=tb_Student.Sno
)
)


我发现这里是用到了tb\_Student,tb\_Course,tb\_SC三张表。  
 但是对于一个同样的类似的问题,  
 问题:查询至少选修了1001号老师所有课程的学生的学号。SQL语句如下:



select distinct Sno
from tb_SC x
where not exists(
select *
from tb_Course,tb_Teacher
where tb_Course.Tno=tb_Teacher.Tno
and tb_Teacher.Tno=‘1001’ and not exists(
select *
from tb_SC y
where x.Sno=y.Sno and y.Cno=tb_Course.Cno
)
)


但是这里仅仅使用了tb\_SC表,和tb\_Course表(tb\_Teacher表忽略,因为和它关系不大)。我就在想,我觉得按照之前我的想法,这里写成这这样子应该也是没有问题的:



select Sno
from tb_Student
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取
阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值