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年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
需要这份系统化资料的朋友,可以点击这里获取
阶课程,涵盖了95%以上网络安全知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新