一、group by 子句
group by 字句可對資料進行分組。
以MySQL5.5的sakila資料庫中的film資料表舉例:查詢出各個電影等級的電影總數
mysql>SELECT rating, COUNT(*) AS ratingCount FROM film > GROUP BY rating
結果如下:
可以看出,group by 子句對其後接的欄位進行了分組,而這裡也用了聚集函式count()對各分組中的專案數進行統計。
二、聚集函式
由上例可以知道,聚集函式是對某個分組的所有行執行特定的操作。下面介紹一些通用的聚集函式:
MAX() : 返回集合中的最大值
MIN() :返回集合中的最小值
AVG() : 返回集合中的平均值
SUM() : 返回集合所有值之和
COUNT() : 返回集合的總條數
還是以film 資料表舉例:注:length欄位在資料表中代表電影時長
mysql> select max(length),
-> min(length),
-> avg(length),
-> sum(length),
-> count(*)
-> from film;
結果以下
聚集函式可以建立參數列達式,可以根據需要任意增加複雜度,只需要保證最後返回一個數字、字串或日期即可。
三、聚集函式對null值的處理
sum()、avg()、max()函式都會忽略分組集合中的null值。需要注意,count(欄位)是對分組集合中的個數統計,會忽略null,而count(*)表示統計分組集合的行數,不會忽略null。
四、having 子句
先看例子:查詢出各個電影等級的電影總數且總數大於200
mysql> SELECT rating, COUNT(*) AS ratingCount FROM film -> GROUP BY rating -> WHERE ratingCount>200;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that -- 報錯
corresponds to your MySQL server version for the right syntax to use near 'WHERE
ratingCount>200' at line 3
查詢的where 子句中不能包含聚集函式,這是因為where 子句是在分組前執行的,伺服器此時還不能對分組執行任何函式。因此,可用having 子句使用聚集函式進行過濾資料
mysql> select rating, count(*) as ratingCount from film -> group by rating -> having ratingCount>200; +--------+-------------+ | rating | ratingCount | +--------+-------------+ | PG-13 | 223 | | NC-17 | 210 | +--------+-------------+ 2 rows in set (0.00 sec)
五、分組查詢中的where 和 having
當在包含group by子句的查詢中增加過濾條件時,需要考慮過濾是針對原始資料(此時過濾條件應放在where 子句中),還是針對分組後的資料(此時過濾條件應放到having 子句中)。