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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

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

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

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

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

運(yùn)行sql :

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

運(yùn)行sql :

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

運(yùn)行sql :

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

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

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

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

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

假設(shè)有兩張表:

表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的過(guò)程:

1、中間表on條件:

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

2、再對(duì)中間表過(guò)濾where 條件:

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

第二條SQL的過(guò)程:

1、中間表on條件:

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

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

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

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

    關(guān)注

    1

    文章

    772

    瀏覽量

    44205
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3842

    瀏覽量

    64569

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Hive查詢(xún)之where語(yǔ)句剖析

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

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

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

    m3 line stage left channel cir

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

    Where Is Ground?

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

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

    SQL中on條件where條件區(qū)別 數(shù)據(jù)庫(kù)通過(guò)連接兩張或多張表來(lái)返回記錄時(shí),都會(huì)生成一張中間的臨時(shí)表,然后再將這張臨時(shí)表返回給用戶。
    發(fā)表于 11-28 14:34 ?3415次閱讀
    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語(yǔ)句中where條件后為什么要寫(xiě)上1=1

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

    C#基礎(chǔ)教程-查詢(xún)-復(fù)合from、where子句

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

    SQL語(yǔ)句中left join后用on還是where

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

    什么是Shift-Left安全?

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

    insert后面可以跟where

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

    sql語(yǔ)句where條件查詢(xún)

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

    sql怎么where條件判斷

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

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

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

    sql的where條件多個(gè)and順序

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

    sql語(yǔ)句多個(gè)條件怎么連接

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