學習數據庫系統概論不得不知道的-------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

                                )

                   );

 

第四章、予人玫瑰

若果對您有版主請點贊收藏關注,多點點。

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