分組函數
分組函數是對錶中的一組記錄進行操作,每組返回一個結果。
分組函數一共5個
- COUNT 求總數
- SUM 求總和
- AVG 求平均數
- MAX 求最大數
- MIN 求最小數
分組函數的特點
- 分組函數自動忽略NULL,例如下面的查詢
SELECT COUNT(time) FROM act_user;
如果time中存在NULL字段,那麼分組函數自動忽略。
- 要想列值爲NULL也參與函數的計算,必須使用IFNULL函數對NULL值做裝換。
- 不允許出現嵌套
COUNT(*)和COUNT(time)區別
COUNT(*)求的是記錄的總條數,COUNT(time)求的是time這一字段非空的總數
使用GROUP BY創建數據組
如果沒有GROUP BY操作,默認是將所有數據作爲一組進行操作,使用GROUP BY可以將數據分爲不同的組,再使用分組函數。
SELECT COUNT(*) FROM act_user GROUP BY roleid
對於分組所使用的SELECT,後面只能跟上分組函數和當前所分組項。
SELECT COUNT(*),roleid FROM act_user GROUP BY roleid
如果分組條件有多個,我們可以在GROUP BY後添加多個參數
SELECT COUNT(*),roleid FROM act_user GROUP BY roleid,department
GROUP BY和HAVING
HAVING是GROUP BY的搭檔,只有GROUP BY出現時,HAVING才能用,沒有GROUP BY,HAVING無法使用,HAVING對分完組後的數據進行過濾。
HAVING與WHERE作用相似,不過WHERE是在獲得結果集之前進行條件過濾,HAVING是在獲得結果集之後甚至是已經將結果集分組之後才進行的。
SELECT COUNT(*),roleid FROM act_user GROUP BY roleid,department HAVING roleid=1