重點
先匹配,再篩選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...