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

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

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

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

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

來自丨blog.csdn.net/wqc19920906/article/details/79785424

前天寫SQL時本想通過 A left B join on and 后面的條件來使查出的兩條記錄變成一條,奈何發(fā)現(xiàn)還是有兩條。后來發(fā)現(xiàn) join on and 不會過濾結(jié)果記錄條數(shù),只會根據(jù)and后的條件是否顯示 B表的記錄,A表的記錄一定會顯示。不管and 后面的是A.id=1還是B.id=1,都顯示出A表中所有的記錄,并關(guān)聯(lián)顯示B中對應(yīng)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

數(shù)據(jù)庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶。在使用left jion時,on和where條件的區(qū)別如下:1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經(jīng)沒有l(wèi)eft join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。假設(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的過程:1、中間表on條件:

tab1.size = tab2.size

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

tab2.name=’AAA’

第二條SQL的過程:1、中間表on條件:

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

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

責任編輯:haq

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

    關(guān)注

    1

    文章

    751

    瀏覽量

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

    關(guān)注

    7

    文章

    3734

    瀏覽量

    64171
  • SQL語句
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    7018

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    SQL改寫消除相關(guān)子查詢實踐

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

    oracle執(zhí)行sql查詢語句的步驟是什么

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

    oracle sql 定義變量并賦值

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

    sql語句多個條件怎么連接

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

    sqlwhere條件多個and順序

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

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

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

    sql怎么在where條件判斷

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

    sql語句where條件查詢

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

    sql語句中having的用法

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

    oracle更新clob字段sql語句

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

    select語句的基本語法

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

    sql查詢語句大全及實例

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

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

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

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

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