1. 程式人生 > >SQL系列四——分組(group by和having)

SQL系列四——分組(group by和having)

首先,建立資料表如下:

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 排序