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

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 連線。

  1. 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迴圈再對內表進行查詢,

  1. 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

  1. SELECT d.* FROM depart_info d LEFTJOIN user_info u ON d.pid = u.pid WHERE u.pid 
    ISNULL ;  

 經測試耗時在0.001s左右

     

總結:

     1、對於小量資料exists 和in差不多,如果資料較多的話(在百萬行)建議使用exists,更好的話使用關聯查詢。

      2、數量較小,如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。

     3、如果子查詢中返回的任意一條記錄含有空值,則IN查詢將不返回任何記錄,這點需注意。

    4、返回資料是兩個表的多個欄位資料,建議使用關聯查詢。不僅速度快,而且返回資料可以自定義。