- select * from A where id in(select id from B)
結論:in()適合B表比A表資料小的情況
- select a.* from A a where exists(select 1 from B b where a.id=b.id)
EXISTS用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值True或False。 EXISTS 指定一個子查詢,檢測 行 的存在。
結論:exists()適合B表比A表資料大的情況
- 區別及應用場景
in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了 ,另外IN時不對NULL進行處理。
- not in 和not exists
如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。
EXISTS與IN的使用效率的問題,通常情況下采用exists要比in效率高,因為IN不走索引,但要看實際情況具體使用: IN適合於外表大而內表小的情況;EXISTS適合於外表小而內表大的情況。
本作品採用《CC 協議》,轉載必須註明作者和本文連結