前兩天面試,遇到了一道題。說的是LEFT JOIN關聯表中ON,WHERE後面跟條件的區別。面試
當時確實有點懵逼~常常作這種left join,inner join鏈接,卻發現竟然只是模糊的認識。數據庫
回到家後,立刻開啓了「實踐是檢驗真理的惟一標準」模式。blog
三下五除二,建了兩張表嘗試起來。it
首先是Person表,數據以下:io
City表,數據以下:程序
既然是面試題是left join,那咱就試試。im
從上述結果知道, left join會將左表的全部記錄都顯示出來,而在右表不匹配on條件的數據行則該列顯示爲Null。數據
而where條件因爲在left join以外,因此是對鏈接以後的結果再次過濾。img
那這是爲何呢??co
由於數據庫在經過鏈接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,而後再將這張臨時表返回。
在使用left jion時,on和where條件的區別以下:
一、on條件是在生成臨時表時使用的條件,它無論on中的條件是否爲真,都會返回左邊表中的記錄。
二、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。
這下終於「真像大白(●—●)」了。
可是,做爲一個觸類旁通的程序猿,怎能就這樣草草了事。
既然left join是這個結果,那就刨根問底,inner join又是咋回事呢。
經過這個例子,咱們能夠看到,使用on c.country='CHN'和where c.country='CHN'的結果是同樣滴。
可是過程卻不同。
inner join具備left和right的特性的並集,須要兩個表中的數據都符合on條件,才能被篩選出來。
到這裏,咱們就明白了on和where以前的區別。
那麼right join,full join則是能夠順勢推導,有興趣的朋友能夠本身嘗試下。