by子句和where子句的區別?
where篩選是在分組之前篩選,篩選完之后再group by
having是分組之后再篩選,篩選完之前先group by
執行順序:where>sum、count等聚合函數>having
所以where條件里不能有聚合函數,因為where條件在聚合函數之前執行。
若須引入聚合函數來對group by 結果進行過濾 則只能用having。(此處不多說,自己想 是先執行聚合函數還是先過濾 然后比對我上面列出的執行順序 一看便知)
樣例:selectsum(score)fromstudentwheresex='man'groupbynamehavingsum(score)>210
注意事項 :
1、where 后不能跟聚合函數,因為where執行順序大于聚合函數。
2、where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。
3、having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標準進行分組。