sql連線時的on和where注意事項

2021-08-18 19:46:55 字數 848 閱讀 5462

我們經常會通過連線來對組合多個表的資訊進行查詢,常用的left join,right join, inner join,full join等等。剛剛在使用連線查詢資料時,踩了個坑,這裡進行總結下。

select a.keyword_id, a.keyword_value, a.keyword_pv 'pv', if(b.keyword_cheat_pv is null, 0, b.keyword_cheat_pv) 'cheat_pv' 

from a a left join b b on a.keyword_id = b.keyword_id

where b.channel = 1

查詢結果卻不符合預期,感覺像是以表b為基準了。查詢了些資料才發現連線時,條件限制放在on還是where處要判斷下。

on條件是在根據連線生成笛卡爾集時進行過濾的條件;where條件則是對經過連線後生成的臨時表進行條件過濾。結合上面的case來看的話,在根據on條件生成了臨時表後,再執行where過濾,那麼就只會保留b中與a匹配的結果而且channel為1(因為匹配不成功的channel為null,不滿足b.channel = 1這個條件)。所以sql修改為:

select a.keyword_id, a.keyword_value, a.keyword_pv 'pv', if(b.keyword_cheat_pv is null, 0, b.keyword_cheat_pv) 'cheat_pv' 

from a a left join b b on a.keyword_id = b.keyword_id and b.channel = 1

把需要對右表的限制移到on中(右連線的話則相反),問題解決。

連線查詢時的where與and

這裡有兩條sql語句 1.select e.employeeid,e.employeename,d.departmentname from employee e left join department d on e.departmentid d.departmentid and e.employe...

left jion時,on和where條件的區別

在使用left jion時,on和where條件的區別如下 1 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。2 where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義 必須返回左邊表的記錄 了,條件不為真的就全部過...

left jion時,on和where條件的區別

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。在使用left jion時,on和where條件的區別如下 1 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。2 where條件是在臨時表生成好後,再對臨時表...