1. 程式人生 > >Sql語句優化-查詢兩表不同行NOT IN、NOT EXISTS、連接查詢Left Join

Sql語句優化-查詢兩表不同行NOT IN、NOT EXISTS、連接查詢Left Join

exists join ngs sdn 連接查詢 blog 建議 開發 word

在實際開發中,我們往往需要比較兩個或多個表數據的差別,比較那些數據相同那些數據不相同,這時我們有一下三種方法可以使用: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
  1. 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
  1. 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
  1. 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