Sql語句優化-查詢兩表不同行NOT IN、NOT EXISTS、連線查詢Left Join
在實際開發中,我們往往需要比較兩個或多個表資料的差別,比較那些資料相同那些資料不相同,這時我們有一下三種方法可以使用:1. IN或NOT IN,2. EXIST或NOTEXIST,3.使用連線查詢(inner join,left join 或者 right join)。
看下面的資料,我們準備選擇出在depart_info中的pid在user_info中不存在的depart_資訊。
有表1:depart_info
表2:user_info
方法一:採用NOT IN
IN和NOT IN後面接的是一個集合,in 是把外表和內表作hash 連線。
- SELECT d.* FROM depart_info d WHERENOT EXISTS (SELECT * FROM user_info u WHERE d.pid = u.pid);
經測試耗時在0.002s左右。
方法二:採用NOT EXISTS
EXISTS 和 NOT EXISTS是對外表作loop迴圈,每次loop迴圈再對內表進行查詢,
- SELECT d.* FROM depart_info d WHERENOT EXISTS (SELECT * FROM user_info u WHERE d.pid = u.pid);
經測試耗時在0.002s左右。
方法三:採用連線查詢
連線查詢包括:
1、自連線(join 等同於inner join ):查詢結果為兩邊都存在的資料
2、左連線 left join :返回左邊全部資料,右邊存在返回,不存在為null
3、 右連線 right join :返回右邊全部資料,左邊存在返回,不存在為null
4、 全連線 full join :只要某個表中存在就返回,另一個不存在為nul
-
SELECT d.* FROM depart_info d LEFTJOIN user_info u ON d.pid = u.pid WHERE u.pid
經測試耗時在0.001s左右
總結:
1、對於小量資料exists 和in差不多,如果資料較多的話(在百萬行)建議使用exists,更好的話使用關聯查詢。
2、數量較小,如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。
3、如果子查詢中返回的任意一條記錄含有空值,則IN查詢將不返回任何記錄,這點需注意。
4、返回資料是兩個表的多個欄位資料,建議使用關聯查詢。不僅速度快,而且返回資料可以自定義。