前兩天面試,遇到了一道題。說的是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則是可以順勢推導,有興趣的朋友可以自己嘗試下。