MySQL學習記錄--分組與聚集

Pyerlife發表於2016-11-29

一、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 子句中)。

相關文章