今天學習了一個問題,和大家分享下.
首先來糾正一個問題就是:大家普遍認爲正確的一個問題--exists比in效率高的說法是不準確的.一 我們首先來講解in和exists的用法,區別:
1.如果兩個表中一個較小,另一個較大.則子查詢表大的,用exists,子查詢表小的用in:
舉個例子,來說明問題.
訂單表Order_M(小表), 訂單明細表Order_Detail(大表).
SELECT *
FROM Order_M m
WHERE m.Order_ID IN (SELECT od.Order_ID FROM Order_Detail od)
那麼,這種效率就是比較低效的,用到了Order_M表上Order_ID列的索引;
SELECT *
FROM Order_M m
WHERE EXISTS(SELECT od.Order_ID FROM Order_Detail od WHERE m.Order_ID=od.Order_ID)
那麼,這種效率就是比較高效的,用到了Order_Detail表上Order_ID列的索引.
2.相反的一種情況,不在贅述.
二 not in和not exists
1.如果查詢語句使用了not in那麼內外表都進行全表掃描,沒有用到索引,而not extsts的子查詢依然能用到表上的索引。
2.所以無論那個表大,用not exists都比not in要快。