遥想公瑾当年小乔出嫁了,错,乱入的什么东西,就是上学没好好学,之后花费大把大把的时间进行补习,没有了学校的环境真的好难,有人会说“这样的语法是给那些思路特别的人用的”,但是怎么办,考试会考啊,你学不学?
目录
第一章、高山仰止
数据库系统概论-数据查询-嵌套查询 人大老师杜小勇版本视频。
数据库系统概论(第5版)
看视频的时候觉得好多人都说,看不懂,听不懂,其实是我们这代人心太浮了,老师讲的好好的,我们需要认真听,认真听,再认真听,实在不行就看看我的文章和我录制的视频。哈哈。
第二章、闭门读书
不讲原理和底层执行顺序啥的,就是随便聊聊。
类比于in:
in理解为先求出后面表的计算结果或者说范围,再在主表中看条件是否满足。
exist是先在主表中取出要的结果,之后去后面的循环检查是否exist或者不存在,是否满足后面的条件。
用not exists都比not in要快。
注意:存在一种not in 会导致索引失效
select * from A where c2 not in (select c2 from B); -->执行结果:无
先取 (select c2 from B) 【2,NULL】;使用not in 的时候,如果not in后面的选项中有null,不会查询出来任何数据。sql语句本身直接返回false。
select * from A where not exists(select 1 from B where B.c2=A.c2) -->执行结果:1 3
先取前面的 【1,2】 、【1,3】 一结合就得【1,3】
exists [ɪɡˈzɪsts] (返回结果集,为真)
not exists (不返回结果集,为真)
--------------------------------------------------------------
(一)比如说你要判断某班是否存在一个名为"Kevin"的学生,我们可以用in 运算:
"Kevin" in (select SNAME from Student)
这样(select SNAME from Student) 返回的是一个全班姓名的集合,in用于判断"Kevin"是否为此集合中的一个数据;
同时,我们也可以用exists语句:
exists (select * from Student where SNAME="Kevin")
(二)SELECT id FROM table WHERE name not exists (SELECT 1 FROM table where name=‘aaa’)
查询name不等于aaa的所有ID
是不是我们一般就了解到这里了,就废废了。
第三章、熟能生巧
(EXISTS && NOT EXISTS)数据库系统概论-嵌套查询
(一)查询没有选修‘102’课的学生
SELECT SNO,SNAME FROM S WHERE not exists (SELECT * FROM SC where S.SNO=SNO and CNO=‘102’)
(二) 学生关系S(S#,SNAME,AGE,SEX)
学习关系SC(S#,C#,GRADE)
课程关系C(C#,CNAME)
其中S#学号、C#课程号、SNAME姓名、AGE年龄、SEX性别、GRADE成绩、CNAME课程名
用SQL表达 【检索选修了全部课程的学生姓名】
SELECT SNAME FROM S
WHERE NOT EXISTS
(SELECT * FROM C
WHERE NOT EXISTS
(SELECT * FROM SC
WHERE S#=S.S# AND C#=C.C#
)
)
解析:SELECT SNAME FROM S 取出了学生
WHERE (不存在一门课,这个学生没选)
WHERE NOT EXISTS
(SELECT * FROM C 课---这个学生没选
WHERE NOT EXISTS 不存在他和这个课的关系
(SELECT * FROM SC WHERE SC.S#=S.S# AND SC.C#=C.C#
)
)
-----------------------------------------------------------------------------------------------------------------------------
(三)学生表Student (Sno,Sname,Sex,Sage,Sdept)
课程表Course (Cno,Cname,Credit)
学生选课表SC (Sno,Cno,Grade)
其中Sno(学号)、Sname(姓名)、Sex(性别)、Sage(年龄)、Sdept(所在系名)、Cno(课程号)、Cname(课程名)、Ccredit(学分)、Grade(成绩)
用SQL【查询选修课程包括“1042”号学生所学的课程的学生学号】
SELECT SNO FROM SC SCX
WHERE NOT EXISTS
(SELECT * FROM SC SCY
WHERE SCY.Sno ='1042' AND
NOT EXISTS
(SELECT * FROM SC SCZ
WHERE SCZ.SNO=SCX.SNO AND SCZ.CNO=SCY.CNO
)
);
解析:这个学生A学号选出来,这学生咋样呢?不存在一门课,‘1042’号学生选了,但是A没有选
SELECT SNO FROM SC SCX
WHERE NOT EXISTS 不存在一门课
(SELECT * FROM SC SCY
WHERE SCY.Sno ='1042' AND ‘1042’选了,但是A和可没有关系
NOT EXISTS
(SELECT * FROM SC SCZ
WHERE SCZ.SNO=SCX.SNO AND SCZ.CNO=SCY.CNO
)
);