on、where、having的區別
on、where、having這三個都可以加條件的子句中,on是最先執行,where次之,having最后。
on是在生成中間的臨時表時起作用的,where,having是生成臨時表之后對連接表再進行過濾
on是先把不符合條件的記錄過濾后才進行統計,它就可以減少中間運算要處理的數據,按理說應該速度是最快的
where也應該比having快點的,因為它過濾數據后才進行sum,所以having是最慢的。
select sum(score) as score from subjects where user_name like '%ABC%' group by user_id having score >500 order by score;
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’;
在兩個表聯接時才用on的,所以在一個表的時候,就剩下where跟having比較了。在這單表查詢統計的情況下,如果要過濾的條件沒有涉及到要計算字段,那它們的結果是一樣的,只是where可以使用rushmore技術,而having就不能,在速度上后者要慢。
如果要涉及到計算的字段,就表示在沒計算之前,這個字段的值是不確定的,where的作用時間是在計算之前就完成的,而having就是在計算后才起作用的,所以在這種情況下,兩者的結果會不同。
在多表聯接查詢時,on比where更早起作用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表后,再由where進行過濾,然后再計算,計算完后再由having進行過濾。由此可見,要想過濾條件起到正確的作用,首先要明白這個條件應該在什么時候起作用,然后再決定放在那里
在使用left jion時,on和where條件的區別如下:
1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有left join的含義了,左邊表的記錄條件不為真的就全部被過濾掉了。
在使用 inner join 時,不管是對左表還是右表進行篩選,on and和on where都會對生成的臨時表進行過濾
當使用 left join 時,無論on的條件是否滿足,都會返回左表的所有記錄,對於滿足的條件的記錄,兩個表對應的記錄會連接起來,對於不滿足條件的記錄,那右表字段全部是null
當使用 right join 時,on與where類似,只不過是全部返回右表的所有記錄
當使用 inner join 時,on與where完全相同
left join、right join、inner join、full join、cross join介紹:
left join : 左連接,返回左表中所有的記錄以及右表中連接字段相等的記錄。
right join : 右連接,返回右表中所有的記錄以及左表中連接字段相等的記錄。
inner join: 內連接,又叫等值連接,只返回兩個表中連接字段相等的行。
full join: 全連接,返回兩個表中的並集,left join + right join。
cross join: 結果是笛卡爾積,就是第一個表的行數與第二個表的行數相乘,結果集中的每一行都是第一個表中的行與第二個表中的行的組合,結果集列是兩個表列數相加。
備注:
作者:Shengming Zeng
博客:http://www.cnblogs.com/zengming/
本文是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接。
<歡迎有不同想法或見解的同學一起探討,共同進步>
