SQL語法 left join on 多條件

2021-08-28 18:04:16 字數 2104 閱讀 3164

重點

先匹配,再篩選where條件。

本文將通過幾個例子說明兩者的差別。

表1:product

idamount

1100

2200

3300

4400

表2:product_details

idweight

exist222

04441

55506

661單個條件

select * from product a

left join on product_details b

on a.id = b.id123

以左表為準匹配,結果:

idamount

idweight

exist

1100

null

null

null

2200

2002203

300null

null

null

4400

40044

0條件寫在on 與where區別

查詢1:

select * from product left join product_details

on (product.id = product_details.id)

and product.amount=200;123

結果:id

amount

idweight

exist

1100

null

null

null

2200

2002203

300null

null

null

4400

null

null

0把on的所有條件作為匹配條件,不符合的右表都為null。

查詢2:

select * from product left join product_details

on (product.id = product_details.id)

where product.amount=200;123

idamount

idweight

exist

2200

20022

0匹配完再篩選,結果只有一條記錄。

where *** is null 情況

使用該語句表示:刪除掉不匹配on後面條件的記錄。

where *** is not null 則表示篩選出符合on後面條件的記錄。

常用於只需要左表的資料,比如count id這類。

select a.* from product a left join product_details b

on a.id=b.id and b.weight!=44 and b.exist=0

where b.id is null;123

結果:id

amount

1100

3300

4400

可以直**出,只有id=2的紀錄完全匹配上三個條件,所以篩除這條紀錄,另三條保留,此時這三條紀錄的右表均為null。

篩選出不符合on後面條件的,即 !(a.id=b.id and b.weight!=44 and b.exist=0).

!(a.id=b.id and || !(b.weight!=44) || !(b.exist=0).

(a.id != b.id and || (b.weight = 44) || ( b.exist! = 0).

邏輯 and 和 邏輯 or表示式,其運算元是從左到右求值的。如果第乙個引數做夠判斷操作結果,那麼第二個引數便不會被計算求值(短路效果)。

下面語句與該語句效果相同:(這裡相同指的是最後只用到左表資料,若是將右表資料寫出來是不一樣的)

select a.* from product a left join product_details b

on a.id=b.id

where b.id is null or b.weight=44 or b.exist=1;123

將on的否定條件寫在where後,效果相同。

參考:

sql中的left join on的一些理解

主表 user,關聯表 orders,關聯條件 orders.userid user.id 篩選條件 orders.ordername x user left join orders on orders.userid user.id and orders.ordername x user表和orde...

left join on多個條件怎麼寫

有時我們不僅需要用乙個欄位去關聯,還希望兩個表的兩個欄位都是一樣的,這時候可以這樣寫 select from select id,name,code from table1 aleft join select id,name,code from table2 bon a.id b.id and a....

左查詢left join on簡單總結

應用場景分析 個人觀點,歡迎小祖宗們指正補充 適合存在父子關係的單錶,以及多表的查詢 話不多說上 select from department d1 left join department d2 on d1.dep parent id d2.org id 需要注意的是 d1 left join d...