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

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

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

SQL語(yǔ)句中l(wèi)eft join后用on還是where

Android編程精選 ? 來(lái)源:CSDN博客 ? 作者:jcpp9527 ? 2021-11-22 11:08 ? 次閱讀

來(lái)自丨blog.csdn.net/wqc19920906/article/details/79785424

前天寫(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 * from student s left join class c on s.classId=c.id order by s.id

運(yùn)行sql :

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

運(yùn)行sql :

select * from student s left join class c on s.classId=c.id and c.name=“三年級(jí)三班” order by s.id

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

兩條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的過(guò)程:1、中間表on條件:

tab1.size = tab2.size

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

tab2.name=’AAA’

第二條SQL的過(guò)程:1、中間表on條件:

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

(條件不為真也會(huì)返回左表中的記錄)其實(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é)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guā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

    文章

    750

    瀏覽量

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

    關(guān)注

    7

    文章

    3712

    瀏覽量

    64030
  • SQL語(yǔ)句
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    7015

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

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MySQL聯(lián)表查詢(xún)優(yōu)化

    使用顯示連接left join(right join,inner join),盡量避免隱式連接(where逗號(hào)連接表 .... and ..
    的頭像 發(fā)表于 04-24 12:33 ?418次閱讀
    MySQL聯(lián)表查詢(xún)優(yōu)化

    SQL改寫(xiě)消除相關(guān)子查詢(xún)實(shí)踐

    GaussDB (DWS) 根據(jù)子查詢(xún)?cè)?SQL 語(yǔ)句中的位置把子查詢(xún)分成了子查詢(xún)、子鏈接兩種形式。
    的頭像 發(fā)表于 12-27 09:51 ?355次閱讀

    oracle執(zhí)行sql查詢(xún)語(yǔ)句的步驟是什么

    Oracle數(shù)據(jù)庫(kù)是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),具有強(qiáng)大的SQL查詢(xún)功能。Oracle執(zhí)行SQL查詢(xún)語(yǔ)句的步驟包括編寫(xiě)SQL語(yǔ)句、解析
    的頭像 發(fā)表于 12-06 10:49 ?775次閱讀

    oracle sql 定義變量并賦值

    在Oracle SQL中,變量是用來(lái)存儲(chǔ)數(shù)據(jù)值的標(biāo)識(shí)符。通過(guò)定義和使用變量,我們可以在SQL語(yǔ)句中使用它們來(lái)存儲(chǔ)和處理數(shù)據(jù),從而實(shí)現(xiàn)更靈活和動(dòng)態(tài)的查詢(xún)和操作。 在Oracle SQL
    的頭像 發(fā)表于 12-06 10:46 ?2079次閱讀

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

    的情況。例如,我們要查詢(xún)員工表中年齡在25到35之間的所有員工,可以使用如下SQL語(yǔ)句: SELECT * FROM employees WHERE age >= 25 AND age 35 ; 這條
    的頭像 發(fā)表于 11-23 11:34 ?1925次閱讀

    sqlwhere條件多個(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 ?3381次閱讀

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

    SQL語(yǔ)句中WHERE條件是用來(lái)篩選數(shù)據(jù)的,它決定了哪些數(shù)據(jù)會(huì)被返回給用戶(hù)。WHERE條件的執(zhí)行順序是影響SQL
    的頭像 發(fā)表于 11-23 11:31 ?1873次閱讀

    sql怎么在where條件判斷

    SQL中,WHERE條件用于篩選符合特定條件的記錄。它提供了一種在查詢(xún)中過(guò)濾數(shù)據(jù)的方法,使您能夠根據(jù)所需的特定條件對(duì)查詢(xún)結(jié)果進(jìn)行更精確的控制。 在WHERE句中,您可以使用各種操作
    的頭像 發(fā)表于 11-23 11:30 ?1601次閱讀

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

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

    sql語(yǔ)句中having的用法

    SQL語(yǔ)句中,HAVING是一個(gè)用于對(duì)GROUP BY子句的結(jié)果進(jìn)行過(guò)濾和限制的子句。它類(lèi)似于WHERE子句,但作用于聚合函數(shù)的結(jié)果而不是單獨(dú)的行。HAVING子句通常用于對(duì)聚合函數(shù)的結(jié)果進(jìn)行條件
    的頭像 發(fā)表于 11-23 11:23 ?1639次閱讀

    oracle更新clob字段sql語(yǔ)句

    在Oracle中,更新CLOB字段可以使用UPDATE語(yǔ)句。CLOB字段是用于存儲(chǔ)大量文本數(shù)據(jù)的數(shù)據(jù)類(lèi)型,可以存儲(chǔ)最多4GB的數(shù)據(jù)。下面是一些詳細(xì)的信息和示例。 UPDATE語(yǔ)法: UPDATE 表
    的頭像 發(fā)表于 11-21 11:29 ?3547次閱讀

    select語(yǔ)句的基本語(yǔ)法

    SELECT語(yǔ)句SQL(Structured Query Language,結(jié)構(gòu)化查詢(xún)語(yǔ)言)中的一種查詢(xún)語(yǔ)句,用于從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)。它是數(shù)據(jù)庫(kù)操作中最常用和基本的語(yǔ)句之一。在本文中
    的頭像 發(fā)表于 11-17 16:23 ?1369次閱讀

    sql查詢(xún)語(yǔ)句大全及實(shí)例

    SQL(Structured Query Language)是一種專(zhuān)門(mén)用于數(shù)據(jù)庫(kù)管理系統(tǒng)的標(biāo)準(zhǔn)交互式數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)言。它被廣泛應(yīng)用于數(shù)據(jù)庫(kù)管理和數(shù)據(jù)操作領(lǐng)域。在本文中,我們將為您詳細(xì)介紹SQL查詢(xún)語(yǔ)句
    的頭像 發(fā)表于 11-17 15:06 ?1172次閱讀

    考慮x和z在verilog條件語(yǔ)句中的使用情況

    首先,考慮x和z在verilog條件語(yǔ)句中的使用情況,然后我們?cè)倏紤]在verilog中用x和z給其他reg/wire賦值的情況。
    的頭像 發(fā)表于 11-02 09:40 ?1407次閱讀
    考慮x和z在verilog條件<b class='flag-5'>語(yǔ)句中</b>的使用情況

    MySQL到底是join性能好,還是in一下更快呢?

    事情是這樣的,去年入職的新公司,之后在代碼review的時(shí)候被提出說(shuō),不要寫(xiě)joinjoin耗性能還是慢來(lái)著,當(dāng)時(shí)也是真的沒(méi)有多想,那就寫(xiě)in好了,最近發(fā)現(xiàn)in的數(shù)據(jù)量過(guò)大的時(shí)候會(huì)導(dǎo)致sql
    的頭像 發(fā)表于 10-31 15:40 ?281次閱讀
    MySQL到底是<b class='flag-5'>join</b>性能好,<b class='flag-5'>還是</b>in一下更快呢?