參考: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的速度較快。
定一個子查詢,檢測行的存在。遍歷循環外表,而後看外表中的記錄有沒有和內表的數據同樣的。匹配上就將結果放入結果集中。
in 和 exists的區別: 若是子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之若是外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實咱們區分in和exists主要是形成了驅動順序的改變(這是性能變化的關鍵),若是是exists,那麼之外層表爲驅動表,先被訪問,若是是IN,那麼先執行子查詢,因此咱們會以驅動表的快速返回爲目標,那麼就會考慮到索引及結果集的關係了 ,另外IN時不對NULL進行處理。
in 是把外表和內表做hash 鏈接,而exists是對外表做loop循環,每次loop循環再對內表進行查詢。一直以來認爲exists比in效率高的說法是不許確的。
若是查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。因此不管那個表大,用not exists都比not in要快。