Sql語句最佳化-查詢兩表不同行NOT IN、NOT EXISTS、串連查詢Left Join,existsleft

來源:互聯網
上載者:User

Sql語句最佳化-查詢兩表不同行NOT IN、NOT EXISTS、串連查詢Left Join,existsleft

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


   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、返回資料是兩個表的多個欄位資料,建議使用關聯查詢。不僅速度快,而且返回資料可以自訂。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.