0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

在使用left jion時,on和where條件的區(qū)別

數(shù)據(jù)分析與開發(fā) ? 來源:數(shù)據(jù)分析與開發(fā) ? 2023-06-16 14:46 ? 次閱讀

前天寫SQL時本想通過 A left B join on and 后面的條件來使查出的兩條記錄變成一條,奈何發(fā)現(xiàn)還是有兩條。

后來發(fā)現(xiàn) join on and 不會過濾結果記錄條數(shù),只會根據(jù)and后的條件是否顯示 B表的記錄,A表的記錄一定會顯示。

不管and 后面的是A.id=1還是B.id=1,都顯示出A表中所有的記錄,并關聯(lián)顯示B中對應A表中id為1的記錄或者B表中id為1的記錄。

運行sql :

select*fromstudentsleftjoinclasscons.classId=c.idorderbys.id
9995c980-0bf9-11ee-962d-dac502259ad0.png

運行sql :

select*fromstudentsleftjoinclasscons.classId=c.idands.name="張三"orderbys.id
99acf1fa-0bf9-11ee-962d-dac502259ad0.png

運行sql :

select*fromstudentsleftjoinclasscons.classId=c.idandc.name="三年級三班"orderbys.id
99b6cf5e-0bf9-11ee-962d-dac502259ad0.png

數(shù)據(jù)庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶。

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

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

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

假設有兩張表:

表1:tab2

id size
1 10
2 20
3 30

表2:tab2

size name
10 AAA
20 BBB
30 CCC

兩條SQL:

1、

select*formtab1leftjointab2on(tab1.size=tab2.size)wheretab2.name=’AAA’

2、

select*formtab1leftjointab2on(tab1.size=tab2.sizeandtab2.name=’AAA’)

第一條SQL的過程:

1、中間表on條件:

tab1.size=tab2.size
99d5a2e4-0bf9-11ee-962d-dac502259ad0.png

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

tab2.name=’AAA’
99f17974-0bf9-11ee-962d-dac502259ad0.png

第二條SQL的過程:

1、中間表on條件:

tab1.size=tab2.sizeandtab2.name=’AAA’

(條件不為真也會返回左表中的記錄)9a0ecc2c-0bf9-11ee-962d-dac502259ad0.png

其實以上結果的關鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會返回left或right表中的記錄,full則具有l(wèi)eft和right的特性的并集。而inner jion沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。
責任編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    750

    瀏覽量

    43902
  • 數(shù)據(jù)庫

    關注

    7

    文章

    3712

    瀏覽量

    64030

原文標題:SQL 語句中 left join 后用 on 還是 where,區(qū)別大了!

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Hive查詢之where語句剖析

    黑猴子的家:Hive 查詢之 where 語句
    發(fā)表于 07-12 13:46

    為什么Crosstalk,Left-to-Right 和Right-to-Left是不一樣的?

    看了些D類功放的SPEC,發(fā)現(xiàn)Crosstalk,Left-to-Right 和Right-to-Left是不一樣的?為什么會不一樣?
    發(fā)表于 08-12 06:27

    m3 line stage left channel cir

    m3 line stage left channel circuit
    發(fā)表于 09-08 21:48 ?2052次閱讀
    m3 line stage <b class='flag-5'>left</b> channel cir

    Where Is Ground?

    Where Is Ground? Bill Laumeister
    發(fā)表于 10-02 00:06 ?928次閱讀
    <b class='flag-5'>Where</b> Is Ground?

    SQL中on條件where條件區(qū)別

    SQL中on條件where條件區(qū)別 數(shù)據(jù)庫通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶。
    發(fā)表于 11-28 14:34 ?3356次閱讀
    SQL中on<b class='flag-5'>條件</b>與<b class='flag-5'>where</b><b class='flag-5'>條件</b>的<b class='flag-5'>區(qū)別</b>

    SQL語句中where條件后為什么要寫上1=1

    這段代碼應該是由程序(例如Java)中生成的,where條件中 1=1 之后的條件是通過 if 塊動態(tài)變化的。例如:
    的頭像 發(fā)表于 02-15 14:51 ?5092次閱讀

    C#基礎教程-查詢-復合from、where子句

    C#基礎教程-查詢-復合from、where子句(嵌入式開發(fā)平臺排行榜)-文檔為C#基礎教程-查詢-復合from、where子句總結文檔,是一份不錯的參考資料,感興趣的可以下載看看,,,,,,,,,,,,,
    發(fā)表于 08-04 14:53 ?1次下載
    C#基礎教程-查詢-復合from、<b class='flag-5'>where</b>子句

    SQL語句中left join后用on還是where

    來自丨blog.csdn.net/wqc19920906/article/details/79785424 前天寫SQL時本想通過 A left B join on and 后面的條件來使查出的兩條
    的頭像 發(fā)表于 11-22 11:08 ?2071次閱讀

    什么是Shift-Left安全?

    軟件開發(fā)中,Shift-Left是一種幫助開發(fā)人員軟件開發(fā)過程早期發(fā)現(xiàn)漏洞和編碼錯誤的做法。Shift-Left Security是一種有效的方法,它專注于安全性,并有助于
    的頭像 發(fā)表于 05-16 11:31 ?714次閱讀
    什么是Shift-<b class='flag-5'>Left</b>安全?

    insert后面可以跟where

    可以,"INSERT"語句可以與"WHERE"子句一起使用。"INSERT"語句用于向數(shù)據(jù)庫表中插入新的行,而"WHERE"子句用于指定插入行的條件。 下面是一個示例: INSERT INTO 表名
    的頭像 發(fā)表于 11-21 14:20 ?5571次閱讀

    sql語句where條件查詢

    的細節(jié),包括使用的操作符、條件的組合、多張表的查詢、條件的性能優(yōu)化等方面。 首先,讓我們了解一下WHERE子句中常用的操作符。SQL中,常用的操作符包括: 比較操作符: 等于(=):
    的頭像 發(fā)表于 11-23 11:28 ?928次閱讀

    sql怎么where條件判斷

    SQL中,WHERE條件用于篩選符合特定條件的記錄。它提供了一種查詢中過濾數(shù)據(jù)的方法,使您能夠根據(jù)所需的特定
    的頭像 發(fā)表于 11-23 11:30 ?1601次閱讀

    sql where條件的執(zhí)行順序

    深入討論WHERE條件的執(zhí)行順序之前,先回顧一下一般SQL語句的執(zhí)行順序。一條SQL語句的執(zhí)行通??梢苑譃橐韵聨讉€步驟:解析器分析語法、語義校驗、查詢優(yōu)化器生成執(zhí)行計劃、執(zhí)行計劃生成與執(zhí)行。在這個過程中,
    的頭像 發(fā)表于 11-23 11:31 ?1868次閱讀

    sql的where條件多個and順序

    SQL中,WHERE子句用于過濾查詢結果以提供符合特定條件的記錄。當有多個AND操作符時,WHERE子句的順序并不會影響查詢結果,但是正確的AND操作符順序可以提高查詢的可讀性和性能
    的頭像 發(fā)表于 11-23 11:33 ?3381次閱讀

    sql語句多個條件怎么連接

    SQL中,多個條件可以使用邏輯運算符連接,常用的邏輯運算符有AND、OR和NOT。這些運算符可以幫助我們查詢中指定多個條件以過濾數(shù)據(jù),從而獲得我們需要的結果集。 AND運算符用于同
    的頭像 發(fā)表于 11-23 11:34 ?1925次閱讀