使用Left join 過(guò)濾條件在on和where之后的區(qū)別

一個(gè)簡(jiǎn)單的例子:A、B表關(guān)聯(lián)查詢(xún)?nèi)缦拢?/p>

select * from A left join B
on A.a = B.b
where A.c = xx

分析:sql先執(zhí)行select * from A left join B on A.a = B.b,會(huì)將結(jié)果拼裝成一個(gè)臨時(shí)表,where的條件就是過(guò)濾臨時(shí)表
,如果where中有B表的約束,則就相當(dāng)于inner join了(原因:獲取臨時(shí)表中滿(mǎn)足B表?xiàng)l件的數(shù)據(jù),原本left join拼裝的臨時(shí)表包含在A所有行以及滿(mǎn)足on后條件匹配到的B表的所有行(沒(méi)有的則是null),所以如果where中有B的過(guò)濾條件,
select * from A left join B on A.a = B.b where A.c = xx and B.d = xx
可想而知null肯定都會(huì)被過(guò)濾,其對(duì)應(yīng)的原本A表的數(shù)據(jù)也會(huì)被過(guò)濾,退化成inner join了)。

總之,on是創(chuàng)建臨時(shí)表之前,而where是對(duì)臨時(shí)表進(jìn)行過(guò)濾,若想對(duì)B表過(guò)濾,則需要寫(xiě)在on之后,否則失去了使用left join的意義,如下:

select * from A left join B
on A.a = B.b
and B.d = xx
where A.c = xx
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容