一般來說,這兩個是用來做兩張(或更多)表聯合查詢用的,in是把外表和內表作hash 連接,而exists 是對外表作loop 循環,假設有A、B兩個表,使用時是這樣的:
1、select * from A where id in (select id from B)--使用in
2、select * from A where exists(select B.id from B where B.id=A.id)--使用exists
也可以完全不使用in和exists:
3、select A.* from A,B where A.id=B.id--不使用in和exists
具體使用時到底選擇哪一個,主要考慮查詢效率問題:
第一條語句使用了A表的索引;
第二條語句使用了B表的索引;
第三條語句同時使用了A表、B表的索引;
如果A、B表的數據量不大,那么這三個語句執行效率幾乎無差別;
如果A表大,B表小,顯然第一條語句效率更高,反之,則第二條語句效率更高;
第三條語句盡管同時使用了A表、B表的索引,單掃描次數是笛卡爾乘積,效率最差。