LEFT JOIN的時候應該用ON還是WHERE?

2022-01-09 有關SQL

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

— THE END —

猜你喜歡:

2019 MySQL8 24小時快速入門(1)

2019 MySQL8 24小時快速入門(2)

相關焦點

  • Left Join 後用 on 還是 where,區別大了!
    前天寫SQL時本想通過 A left B join on and 後面的條件來使查出的兩條記錄變成一條,奈何發現還是有兩條。後來發現 join on and 不會過濾結果記錄條數,只會根據and後的條件是否顯示 B表的記錄,A表的記錄一定會顯示。
  • SQL語句中 LEFT JOIN後用 ON 還是 WHERE,區別大了!
    ,奈何發現還是有兩條。在使用left join時,on和where條件的區別如下:1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
  • SQL語句中 left join 後用 on 還是 where,區別大了!
    B join on and 後面的條件來使查出的兩條記錄變成一條,奈何發現還是有兩條。後來發現 join on and 不會過濾結果記錄條數,只會根據and後的條件是否顯示 B表的記錄,A表的記錄一定會顯示。不管and 後面的是A.id=1還是B.id=1,都顯示出A表中所有的記錄,並關聯顯示B中對應A表中id為1的記錄或者B表中id為1的記錄。
  • SQL 語句中 left join 後用 on 還是 where,區別大了!
    能浪的浪,才是好浪!每天 8:55 更新文章,每天掉億點點頭髮...不管and 後面的是A.id=1還是B.id=1,都顯示出A表中所有的記錄,並關聯顯示B中對應A表中id為1的記錄或者B表中id為1的記錄。
  • 面試官:left join 後用 on 和 where 有什麼區別?
    不管 and 後面的是 A.id=1 還是 B.id=1, 都顯示出 A 表中所有的記錄,並關聯顯示 B 中對應 A 表中 id 為 1 的記錄或者 B 表中 id 為 1 的記錄。運行 sql :select * from student s left join class c on s.classId=c.id order by s.id運行 sql :
  • 關於Left join,避坑指南
    join 是 SQL查詢中很常見的一種操作,具體來講有join,left join, right join,full join等很多形式。具體的原理如下圖所示。但其中最常見的還是使用left join 。
  • MySQL:Left Join 避坑指南
    答案是兩個需求都是第一條語句是正確的,要搞清楚這個問題,就得明白mysql對於left join的執行原理,下節進行展開。根源mysql 對於left join的採用類似嵌套循環的方式來進行從處理,以下面的語句為例:SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2(LT,RT)其中P1是on過濾條件,缺失則認為是TRUE,P2是where過濾條件,缺失也認為是TRUE,該語句的執行邏輯可以描述為:FOR
  • MySQL:left join 避坑指南
    現象left join在我們使用mysql查詢的過程中可謂非常常見,比如博客裡一篇文章有多少條評論、商城裡一個貨物有多少評論、一條評論有多少個贊等等。但是由於對join、on、where等關鍵字的不熟悉,有時候會導致查詢結果與預期不符,所以今天我就來總結一下,一起避坑。
  • 資料庫系列 | left join加上where條件咋了?
    3LEFT JOIN 關鍵字語法SELECT column_name(s)FROM table_name1LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name**注釋:**在某些資料庫中, LEFT
  • MySQL:LEFT JOIN 避坑指南
    但是由於對join、on、where等關鍵字的不熟悉,有時候會導致查詢結果與預期不符,所以今天我就來總結一下,一起避坑。這裡我先給出一個場景,並拋出兩個問題,如果你都能答對那這篇文章就不用看了。, count(s.name) as num     FROM classes c left join students s     on s.class_id = c.id     where s.gender = 'F'    group by c.name對於需求2,大多數人也可以不假思索的想出如下兩種sql寫法,請問哪種是對的?
  • MySql 之 left join 避坑指南
    (s.name) as num FROM classes c left join students s on s.class_id = c.id where s.gender = 'F' group by c.name對於需求2,大多數人也可以不假思索的想出如下兩種sql寫法,請問哪種是對的?
  • 關於Left join,你可能不知道這些......
    join 是 SQL查詢中很常見的一種操作,具體來講有join,left join, right join,full join等很多形式。具體的原理如下圖所示。但其中最常見的還是使用left join 。
  • Mysql left join 轉 inner join
    在日常優化過程中,發現一個怪事情,同一個SQL出現兩個完全不一樣執行計劃,left join 連驅動表都可以變成不一樣。
  • left semi join和left join區別
    一 使用對比(a表和b表通過user_id關聯)1.1 a表數據
  • MySQL中left join的幾個SQL對比
    ,覺得對於left join的部分還是存在一些誤解。為了演示方便,我用兩張表來說明,test1和test2.join的SQL,這個時候我們使用name='bb'來作為過濾條件,id作為關聯條件。2 | bb || 4 | bb || 5 | bb || 1 | aa || 3 | cc |+----+-+8 rows in set (0.00 sec)如果把原本的on條件改為where,情況有所好轉,不過還是對name='bb'的子集重新做了關聯。
  • left join,right join,inner join,full join之間的區別
    left join,right join,inner join,full join之間的區別通俗講:left以 left join 左側的表為主表
  • mysql 如何優化left join
    and c.hotel_id =h.hotel_id where h.hotel_id is null    這個sql是用來查詢出c表中有h表中無的記錄,所以想到了用left join的特性(返回左邊全部記錄,右表不滿足匹配條件的記錄對應行返回null)來滿足需求,不料這個查詢非常慢。
  • SQL表連接查詢(inner join、full join、left join、right join)
    一、內連接-inner jion :最常見的連接查詢可能是這樣,查出學生的名字和成績:select s.name,m.mark from student s,mark m wheres.id=m.studentid上面就是我們最常見的inner join,即內連接,把符合student.id=mark.studentid 條件的元組才選出來,也可以寫成:select s.name,m.mark from student s inner join mark m on s.id=m.studentid符合條件的只有兩條結果,查出結果為
  • 場景分析:記錄一下使用MySQL的left join時,遇到的坑!
    答案是兩個需求都是第一條語句是正確的,要搞清楚這個問題,就得明白mysql對於left join的執行原理,下節進行展開。從這個偽代碼中,我們可以看出兩點:1.如果想對右表進行限制,則一定要在on條件中進行,若在where中進行則可能導致數據缺失,導致左表在右表中無匹配行的行在最終結果中不出現,違背了我們對left join的理解。
  • inner join 與 left join 之間的區別
    關於inner join 與 left join 之間的區別,以前以為自己搞懂了,今天從前端取參數的時候發現不是預想中的結果