学习数据库系统概论不得不知道的-------NOT EXIST

遥想公瑾当年小乔出嫁了,错,乱入的什么东西,就是上学没好好学,之后花费大把大把的时间进行补习,没有了学校的环境真的好难,有人会说“这样的语法是给那些思路特别的人用的”,但是怎么办,考试会考啊,你学不学?

目录

第一章、高山仰止

第二章、闭门读书

第三章、熟能生巧

第四章、予人玫瑰


第一章、高山仰止

数据库系统概论-数据查询-嵌套查询  人大老师杜小勇版本视频。

数据库系统概论(第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

                                )

                   );

 

第四章、予人玫瑰

若果对您有版主请点赞收藏关注,多点点。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章