SQL 語句中 left join 後用 on 還是 where,區別大了!

2022-01-01 芋道源碼

收錄於話題 #芋道源碼 491個

點擊上方「芋道源碼」,選擇「設為星標」

管她前浪,還是後浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉億點點頭髮...

來源:blog.csdn.net/wqc19920906/

article/details/79785424

前天寫SQL時本想通過 A left 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 :

select * from student s left join class c on s.classId=c.id order by s.id

圖片

運行sql :

select * from student s left join class c on s.classId=c.id and s.name="張三" order by s.id

圖片

運行sql :

select * from student s left join class c on s.classId=c.id and c.name="三年級三班" order by s.id

圖片

資料庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。

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

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

2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。

假設有兩張表:

表1:tab2

表2:tab2

兩條SQL:

1、

select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=』AAA』

2、

select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=』AAA』)

第一條SQL的過程:

1、中間表on條件:

tab1.size = tab2.size

圖片

2、再對中間表過濾where 條件:

tab2.name=』AAA』

圖片

第二條SQL的過程:

1、中間表on條件:

tab1.size = tab2.size and tab2.name=』AAA』

(條件不為真也會返回左表中的記錄)

圖片

其實以上結果的關鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會返回left或right表中的記錄,full則具有left和right的特性的併集。而inner jion沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。


歡迎加入我的知識星球,一起探討架構,交流源碼。加入方式,長按下方二維碼噢

已在知識星球更新源碼解析如下:

最近更新《芋道 SpringBoot 2.X 入門》系列,已經 20 餘篇,覆蓋了 MyBatis、Redis、MongoDB、ES、分庫分表、讀寫分離、SpringMVC、Webflux、權限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能測試等等內容。

提供近 3W 行代碼的 SpringBoot 示例,以及超 4W 行代碼的電商微服務項目。

獲取方式:點「在看」,關注公眾號並回復 666 領取,更多內容陸續奉上。

文章有幫助的話,在看,轉發吧。

謝謝支持喲 (*^__^*)

相關焦點

  • SQL語句中 LEFT JOIN後用 ON 還是 WHERE,區別大了!
    不管and 後面的是A.id=1還是B.id=1,都顯示出A表中所有的記錄,並關聯顯示B中對應A表中id為1的記錄或者B表中id為1的記錄。在使用left join時,on和where條件的區別如下:1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
  • 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的記錄。
  • Left Join 後用 on 還是 where,區別大了!
    前天寫SQL時本想通過 A left B join on and 後面的條件來使查出的兩條記錄變成一條,奈何發現還是有兩條。後來發現 join on and 不會過濾結果記錄條數,只會根據and後的條件是否顯示 B表的記錄,A表的記錄一定會顯示。
  • 面試官:left join 後用 on 和 where 有什麼區別?
    哈嘍,我是狗哥。
  • 【面試必備】SQL中left join、right join、inner join的區別
    joinsql語句如下:select * from Aleft join B on A.aID = B.bID結果如下:aID     aNum     bID     bName1     a20050111    1     20060324012     a20050112    2
  • inner join 與 left join 之間的區別
    關於inner join 與 left join 之間的區別,以前以為自己搞懂了,今天從前端取參數的時候發現不是預想中的結果
  • 資料庫系列 | 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
  • SQL語言中,inner join 、left join 、right join和full join的定義和圖示
    left join 是左連接,返回坐表中所有的行以及右表中符合條件的行。right join右連接,是返回右表中所有的行及左表中符合條件的行。full join全連接,是返回左表中所有的行及右表中所有的行,並按條件連接。
  • left join,right join,inner join,full join之間的區別
    left join,right join,inner join,full join之間的區別通俗講:left以 left join 左側的表為主表
  • SQL 語句 WHERE、HAVING 及 ON 的區別與用法.
    雖然它們都能夠實現類似的功能,但是你知道它們之間的區別嗎?讓我們一起來探討一下。WHERE 與 HAVINGWHERE與HAVING的根本區別在於:因此,WHERE子句中不能使用聚合函數。這兩者之間的主要區別在於:對於內連接查詢而言,以下三個語句的結果相同:-- 語句 1select d.dept_name, e.emp_name, e.sex, e.salaryfrom employee e, department dwhere e.dept_id = d.dept_idand e.emp_id = 10;dept_name
  • LEFT JOIN的時候應該用ON還是WHERE?
    說的是LEFT JOIN關聯表中ON,WHERE後面跟條件的區別。當時確實有點懵逼~經常做這種left join,inner join連接,卻發現居然只是模糊的認識。回到家後,馬上開啟了「實踐是檢驗真理的唯一標準」模式。三下五除二,建了兩張表嘗試起來。
  • 「看這篇就夠了」Mysql join條件是要寫在on裡還是在where裡?
    算法區別select * from a left join b on(a.f1=b.f1) and (a.f2=b.f2)語句執行順序是:1、先掃描a表的數據,放到join_buffer中,join_buffer的數據結構是數組。
  • mysql 如何優化left join
    and c.hotel_id =h.hotel_id where h.hotel_id is null    這個sql是用來查詢出c表中有h表中無的記錄,所以想到了用left join的特性(返回左邊全部記錄,右表不滿足匹配條件的記錄對應行返回null)來滿足需求,不料這個查詢非常慢。
  • inner join 與 left join 之間的區別,你真的搞懂了嗎?
    與 left join 之間的區別,以前以為自己搞懂了,今天從前端取參數的時候發現不是預想中的結果,才知道問題出在inner join 上了。問題就是我用錯了聯結方式。一、sql的left join 、right join 、inner join之間的區別left join(左聯接) :返回包括左表中的所有記錄和右表中聯結欄位相等的記錄right join(右聯接) :返回包括右表中的所有記錄和左表中聯結欄位相等的記錄inner join(等值連接) :只返回兩個表中聯結欄位相等的行舉例如下:
  • MySQL:Left Join 避坑指南
    答案是兩個需求都是第一條語句是正確的,要搞清楚這個問題,就得明白mysql對於left join的執行原理,下節進行展開。如果想對右表進行限制,則一定要在on條件中進行,若在where中進行則可能導致數據缺失,導致左表在右表中無匹配行的行在最終結果中不出現,違背了我們對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,該語句的執行邏輯可以描述為:
  • MySql 之 left join 避坑指南
    答案是兩個需求都是第一條語句是正確的,要搞清楚這個問題,就得明白mysql對於left join的執行原理,下節進行展開。b) { // 遍歷完RT,發現lt在RT中沒有有對應的行,則嘗試用null補一行 IF P2(lt,NULL) {// 補上null後滿足 where 過濾條件 t:=lt||NULL; // 輸出lt和null補上的行 } }}當然,實際情況中MySQL會使用buffer的方式進行優化,減少行比較次數,不過這不影響關鍵的執行流程
  • SQL join語句總結
    語句》,講的是用Venn圖圖解SQL join語句。全外連接可以理解為left join與right join的併集。對應Venn圖求並。由於MySQL中沒有提供full outer join關鍵字,我們需要用left join 與right join 再結合 union來模擬full outer join,用union當然是因為union會去重。
  • 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,該語句的執行邏輯可以描述為:
  • SQL面試題:WHERE和HAVING、ON有什麼區別?
    雖然它們都能夠實現類似的功能,但是你知道它們之間的區別嗎?讓我們一起來探討一下。除非特殊說明,以下內容適用於各種資料庫,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite 等;其中的示例表和數據來源於 [GitHub](https://github.com/dongxuyang1985/thinking_in_sql)。