數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶。
在使用1eft jion時,on和where條件的區別如下:
1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2、where 條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
假設有兩張表:
兩條 SQL:
1、selectform tabl left join tab2 on(tabl.size=tab2.size)where tab2.name='AAA'
2、selectform tabl left join tab2 on(tabl.size=tab2.size and tab2.name='AAA)
第一條SQL的過程:
1、中間表on條件;
2、再對中間表過濾where條件:tab2.name=AAA'tab1.id tab1.size tab2.size tab2.name
第二條SQL的過程:
1、中間表on條件:tabl.size=tab2.size and tab2.name='AAA'(條
件不為真也會返回左表中的記錄)
其實以上結果的關鍵原因就是1eft join,right join,fulljoin的特殊性,不管on上的條件是否為真都會返回1eft或right表中的記錄,ful1則具有1eft和right的特性的並集。而inner join 沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。on為了反映外連接中一方的全連接,而where沒有這個功能,內連接配對是可以的。