sql語句exists 用法

參考:SQL語句exists用法 Sql語句中IN和exists的區別及應用html

如今有三張表sql

學生表S: sno ,snameoop

課程表C:cno ,cname性能

學生選課表SC: sno ,cno spa

查詢選了全部課程的學生信息code

SELECT *
  FROM S T1
 WHERE NOT EXISTS (SELECT 1
          FROM C T2
         WHERE NOT EXISTS (SELECT 1
                  FROM SC T3
                 WHERE T1.SNO = T3.SNO
                   AND T2.CNO = T3.CNO))

我理解就是,上面的語句是查詢不存在每門課都沒有選的學生,那就是選擇了全部課程的學生。上面的語句使用了兩個NOT EXISTS,若是使用EXISTS又是什麼意思呢?htm

 

SELECT *
  FROM S T1
 WHERE EXISTS (SELECT 1
          FROM C T2
         WHERE NOT EXISTS (SELECT 1
                  FROM SC T3
                 WHERE T1.SNO = T3.SNO
                   AND T2.CNO = T3.CNO))

查詢存在着有一門課沒有選擇的學生信息。blog

 

SELECT *
  FROM S T1
 WHERE NOT EXISTS (SELECT 1
          FROM C T2
         WHEREEXISTS (SELECT 1
                  FROM SC T3
                 WHERE T1.SNO = T3.SNO
                   AND T2.CNO = T3.CNO))

查詢不存在選擇了一門課的學生,就是查詢沒有選課的學生信息。索引

 

SELECT *
  FROM S T1
 WHERE EXISTS (SELECT 1
          FROM C T2
         WHEREEXISTS (SELECT 1
                  FROM SC T3
                 WHERE T1.SNO = T3.SNO
                   AND T2.CNO = T3.CNO))

查詢選擇了一門課或多門課的學生信息,就是查詢至少選擇了一門課的學生信息。get

 

日常用的可能是IN,那麼IN和EXISTS有什麼區別呢?

對IN執行過程的描述

  肯定給定的值是否與子查詢或列表中的值相匹配。in在查詢的時候,首先查詢子查詢的表,而後將內表和外表作一個笛卡爾積,而後按照條件進行篩選。因此相對內表比較小的時候,in的速度較快。

對EXISTS執行過程的描述

  定一個子查詢,檢測行的存在。遍歷循環外表,而後看外表中的記錄有沒有和內表的數據同樣的。匹配上就將結果放入結果集中。

區別即應用場景

 in 和 exists的區別: 若是子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之若是外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實咱們區分in和exists主要是形成了驅動順序的改變(這是性能變化的關鍵),若是是exists,那麼之外層表爲驅動表,先被訪問,若是是IN,那麼先執行子查詢,因此咱們會以驅動表的快速返回爲目標,那麼就會考慮到索引及結果集的關係了 ,另外IN時不對NULL進行處理。

 in 是把外表和內表做hash 鏈接,而exists是對外表做loop循環,每次loop循環再對內表進行查詢。一直以來認爲exists比in效率高的說法是不許確的。

not in 和not exists

  若是查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。因此不管那個表大,用not exists都比not in要快。

相關文章
相關標籤/搜索