SELECT * FROM USER
WHERE id IN (
SELECT id FROM USER WHERE id%5=1
)
SELECT * FROM USER u1
WHERE EXISTS (
SELECT u2.id FROM USER u2 WHERE u2.id%5=1 AND u1.id=u2.id
)
in 是先查出子查詢的結果集,然後和外查詢進行笛卡爾積,相當於雙重for循環進行匹配.
exists 是先查出外循環,然後遍歷每一行結果去執行內查詢看是否返回true.
所以,對於exists來說,內層結果集不影響效率,外層結果集的數量嚴重影響效率,如果外層查詢結果很少,適合用exists.
對於in來說,雙重for循環匹配時,內層結果集數量越少,總循環次數期望越少.如果內層查詢結果很少,適合用in