SQL系列四——分組(group by和having)
阿新 • • 發佈:2019-02-15
首先,建立資料表如下:
1、資料分組(GROUP BY):
SQL中資料可以按列名分組,搭配聚合函式十分實用。
例,統計每個班的人數:
SELECT student_class,COUNT(ALL student_name) AS 總人數 FROM t_student GROUP BY (student_class);
AS為定義別名,別名的使用在組合及聯接查詢時會有很好的效果,之後再說。
分組中也可以加入篩選條件WHERE,不過這裡一定要注意的是,執行順序為:WHERE過濾→分組→聚合函式。牢記!
統計每個班上20歲以上的學生人數:
SELECT student_class,COUNT(student_name) AS 總人數 FROM t_student WHERE student_age >20 GROUP BY (student_class);
2、HAVING過濾條件:
之前說了分組操作、聚合函式、WHERE過濾的執行順序,那如果我們希望在聚合之後執行過濾條件怎麼辦?
例,我們想查詢平均年齡在20歲以上的班級
能用下面的語句嗎?
SELECT student_class, AVG(student_age) FROM t_student WHERE AVG(student_age)>20 GROUP BY student_class;
結果會出錯。正因為聚合函式在WHERE之後執行,所以這裡在WHERE判斷條件里加入聚合函式是做不到的。
這裡使用HAIVING即可完成:
SELECT student_class,AVG(student_age) AS 平均年齡 FROM t_student GROUP BY (student_class) HAVING AVG(student_age)>20;
這裡再囉嗦一句
SQL的執行順序:
–第一步:執行FROM
–第二步:WHERE條件過濾
–第三步:GROUP BY分組
–第四步:執行SELECT投影列,聚集函式
–第五步:HAVING條件過濾
–第六步:執行ORDER BY 排序