標籤:條件 count 技術分享 select mysql學習 man alt mysq mysql5.5
一、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 子句中)。
MySQL學習記錄--分組與聚集