SQL優化集

EXISTS代替IN

注:當B表的數據集必須小於A表的數據集時,用in優於exists;

#使用IN
SELECT * FROM class_a WHERE id IN ( SELECT id FROM class_b);
#使用EXISTS 
SELECT * FROM class_a A WHERE EXISTS (SELECT * FROM class_b B WHERE A.id = B.id);
#即
SELECT ... FROM TABLE WHERE EXISTS(subquery)

該語法可以理解爲:將主查詢的數據,放到子查詢中做條件驗證,根據驗證結果(TRUE或FALSE)來決定主查詢的數據結果是否得以保留。

提示

EXISTS(subquery)只返回TRUE或FALSE,因此子查詢中的SELECT*也可以是SELECT 1或其他,官方說法是實際執行時會忽略SELECT清單,因此沒有區別;
EXISTS子查詢的實際執行過程可能經過了優化而不是我們理解上的逐條對比,如果擔憂效率問題,可進行實際檢驗以確定是否有效率問題;
EXISTS子查詢往往也可以用條件表達式、其他子查詢或者JOIN來替代,何種最優需要具體問題具體分析;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章