在多張表連接時,都會生成一張中間表,然後再將這張臨時表返回給用戶。
在用left join中,on和where條件的區別如下:
(1)on條件是在生成中間表時使用的條件,它不管on中的條件是否爲真,都會返回左表中的記錄,右表中的記錄如果不符合on條件,則顯示爲空。
(2)where條件是在中間表生成好之後,再對這張表進行過濾。這時已經和left join沒有關係,不符合where條件的就會被過濾掉。
例子:
表balevent:賬戶餘額表
month:月份
ACCOUNT:賬戶
目標:查詢201906月有發生餘額變動的賬號,並且在201907月沒發生餘額變動的賬號
語句一:正確的寫法
select a.ACCOUNT from balevent a left join balevent b
on a.ACCOUNT=b.ACCOUNT and b.MONTH='201907'
where a.MONTH='201906' and b.ACCOUNT is null ;
語句二:錯誤的寫法,查詢不出來結果
select a.ACCOUNT from balevent a left join balevent b
on a.ACCOUNT=b.ACCOUNT
where a.MONTH='201906' and b.MONTH='201907' and b.ACCOUNT is null ;
注:
如果是用in和not in語句:
select * from balevent a where account not in (select account from balevent b where b.MONTH='201906') and A.MONTH='201907';