where、聚合函數、having 在from后面的執行順序:
where>聚合函數(sum,min,max,avg,count)>having
若須引入聚合函數來對group by 結果進行過濾 則只能用having。( 是先執行聚合函數還是先過濾 然后比對我上面列出的執行順序 一看便知)
HAVING語句通常與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。
HAVING語句的存在彌補了WHERE關鍵字不能與聚合函數聯合使用的不足。
語法:
SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;
如果想查詢平均分高於80分的學生記錄可以這樣寫:
SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore
FROM student
GROUP BY id
HAVING AVG(score)>=80;
在這里,如果用WHERE代替HAVING就會出錯。
注意事項 :
1、where 后不能跟聚合函數,因為where執行順序大於聚合函數。
2、where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。
3、having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標准進行分組。