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 連接。
[sql] view plain copy
- SELECT d.* FROM depart_info d WHERE NOT EXISTS (SELECT * FROM user_info u WHERE d.pid = u.pid);
經測試耗時在0.002s左右。
方法二:采用NOT EXISTS
EXISTS 和 NOT EXISTS是對外表作loop循環,每次loop循環再對內表進行查詢,
[sql] view plain copy
- SELECT d.* FROM depart_info d WHERE NOT 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
[sql] view plain copy
- SELECT d.* FROM depart_info d LEFT JOIN user_info u ON d.pid = u.pid WHERE u.pid IS NULL ;
經測試耗時在0.001s左右
總結:
1、對於小量數據exists 和in差不多,如果數據較多的話(在百萬行)建議使用exists,更好的話使用關聯查詢。
2、數量較小,如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。
3、如果子查詢中返回的任意一條記錄含有空值,則IN查詢將不返回任何記錄,這點需註意。
4、返回數據是兩個表的多個字段數據,建議使用關聯查詢。不僅速度快,而且返回數據可以自定義。
Sql語句優化-查詢兩表不同行NOT IN、NOT EXISTS、連接查詢Left Join