EXISTS
子查詢用來檢查是否有存在符合條件的行,如果子查詢返回至少一行,則外部查詢返回TRUE
,否則返回 FALSE
。通常在需要檢查子查詢是否有符合條件的行時使用。
當查詢結果會返回大量資料的時,使用EXISTS
較符合效能考量,優於IN
,好比說下方的程式碼
兩個查詢結果都會是一樣
SELECT * FROM table_a
WHERE EXISTS
(SELECT * FROM table_b WHERE table_b.id=table_a.id);
以及
SELECT * FROM table_a
WHERE id
in (SELECT id FROM table_b);
EXISTS
只需要確認是否存在符合條件的行,不需要檢查完整的子查詢結果。
然而IN
會在執行前先計算並儲存子查詢的結果集,然後將外部查詢的值與這個結果集進行比較。
第一個SQL
使用EXISTS
,當table_a
和table_b
中有相同id
的值時,就會執行,將其列出來
感覺是假設table_a
中的第一筆資料的id
符合條件時,就顯示出來,以這個邏輯類推。
然後第二個用IN
的SQL
則是會先將SELECT id FROM table_b
中的id
找出來然後儲存
再來才繼續條件比較的部分,當table_a
中的第一筆資料等於SELECT id FROM table_b
中的id
時
就將其列出來。