left join,right join,inner join的條件on和where的區別

langgufu314發表於2013-01-24

1.left join,right join

select * from a left join b on a.id = b.id and a.id ='12'  

此sql語句效果:結果中a表篩選無效(即a表不是意願中只有id='12'的行,而是a表全表記錄依然都在,a.id='12'條件篩選無效果)

原因:a和b左連線的時候,無論條件是什麼,都會把a的所有記錄呈現出來,on後面的條件只能對b進行篩選,對a篩選無效。

同樣右連線:select * from a right join b on 條件1 and 條件2

無論條件是什麼,b中的所有記錄都會呈現,條件1和條件2甚至更多的條件,只能對錶a進行篩選,對b篩選同樣無效。

 

2,inner join

select * from a inner join b on a.id = b.id and a.id='12' (或b.id='12')

在左連線和右連線中,由於一邊的表不受條件會限制呈現出所有記錄,故而條件只能針對另一邊的表進行篩選。而內連線卻不同,它呈現出的記錄中兩表完全受條件限制,條件既可以針對a表進行篩選,同樣也可以針對b表進行篩選。

此連線效果等同於:select * from a,b where a.id=b.id and a.id='12'(或b.id='12')

 

總結:

左連線和右連線on條件只能篩選一邊,內連線可以篩選任何一邊的表,和對笛卡爾積進行的等值連線效果一樣。

在左連線中,若要對左表的結果進行篩選,可以在on後加入where條件,如同:

select * from a left join b on a.id = b.id where a.id='12'

此時結果左表記錄將僅剩下id='12'的行集,同樣適用此方法也可對右連線的右表進行篩選。

事實上select * from a left join b on a.id = b.id 執行後,其結果存放在一個臨時表中,where 條件則是針對臨時表中的記錄集進行篩選,故而最後結果中左表才會被成功篩選。

相關文章