論《LEFT JOIN條件放ON和WHERE后的區別》


前兩天面試,遇到了一道題。說的是LEFT JOIN關聯表中ON,WHERE后面跟條件的區別。

當時確實有點懵逼~經常做這種left join,inner join連接,卻發現居然只是模糊的認識。

 

回到家后,馬上開啟了“實踐是檢驗真理的唯一標准”模式。

三下五除二,建了兩張表嘗試起來。

 

首先是Person表,數據如下:

 

City表,數據如下:

 

既然是面試題是left join,那咱就試試。

 

從上述結果知道, left join會將左表的所有記錄都顯示出來,而在右表不匹配on條件的數據行則該列顯示為Null。

而where條件由於在left join之外,所以是對連接之后的結果再次過濾。

 

那這是為什么呢??

 

因為數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回。

在使用left jion時,on和where條件的區別如下:

1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。

2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。

 

這下終於“真像大白(●—●)”了。

但是,作為一個舉一反三的程序猿,怎能就這樣草草了事。

 

既然left join是這個結果,那就刨根問底,inner join又是咋回事呢。

 

 

通過這個例子,我們可以看到,使用on c.country='CHN'和where c.country='CHN'的結果是一樣滴。

但是過程卻不一樣。

inner join具有left和right的特性的並集,需要兩個表中的數據都符合on條件,才能被篩選出來。

到這里,我們就明白了on和where之前的區別。

 

那么right join,full join則是可以順勢推導,有興趣的朋友可以自己嘗試下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM