1. 程式人生 > >mysql中join後on、where的區別

mysql中join後on、where的區別

可能只看這兩個關鍵字看不出任何的問題。那我們使用實際的例子來說到底有沒有差異。

   例如存在兩張表A,B表資料如下:

 語句一

Sql程式碼 select  A.ID as AID, B.ID as BID   from A leftjoin B on A.ID = B.ID where B.ID<3  

 語句二

Sql程式碼 select  A.ID as AID, B.ID as BID  from A left join B on A.ID = B.ID and  B.ID<3

   以上兩個語句的查詢結果是否一致。

   我們看看實際結果

   語句一的查詢結果

語句二的查詢結果為:

發現兩個查詢存在差異。

為什麼會存在差異,這和on與where查詢順序有關。

我們知道標準查詢關鍵字執行順序為 from->where->group by->having->order by

left join 是在from範圍類所以 先on條件篩選表,然後兩表再做left join。

而對於where來說在left join結果再次篩選。

 第一sql語句查詢過程如下等價於:

    1:先是left join

Sql程式碼  select  A.ID as AID, B.ID as
 BID   from A leftjoin B on A.ID = B.ID  

   查詢結果如下

  

  2:再查詢結果中將B.ID即BID<3篩選出來。

       也就是我們上面看到的結果。

第二sql語句查詢過程如下等價於:

  1:先按照on條件B.ID<3篩選表等價於先篩選B表:

   

   2:已上查詢結果與A表做left join,這也是為什麼我們看到第二個查詢的sql會保留A表的原因。

ON與where的使用一定要注意場所:

    (1):ON後面的篩選條件主要是針對的是關聯表【而對於主表刷選條件不適用】。

    (2):對於主表的篩選條件應放在where後面,不應該放在ON後面。

    (3):對於關聯表我們要區分對待。如果是要條件查詢後才連線應該把查詢件放置於ON後。

                如果是想在連線完畢後才篩選就應把條件放置於where後面。

    (4): 對於關聯表我們其實可以先做子查詢再做join

所以第二個sql等價於

Sql程式碼 

select  A.ID as AID, B1.ID as BID  

from A leftjoin  ( select B.ID from B  where B.ID <3 )B1 on A.ID = B1.ID  

通過以上講解,不知大家是否明白了,歡迎溝通交流。