將結果集依指定欄位分組,每組套用聚合函數(SUM, COUNT, AVG, MAX, MIN)產生單一彙總行。
原始資料:
| Employee | Date | Hours |
|---|---|---|
| John Smith | 5/6/2004 | 8 |
| Allan Babel | 5/6/2004 | 8 |
| Tina Crown | 5/6/2004 | 8 |
| John Smith | 5/7/2004 | 9 |
| Allan Babel | 5/7/2004 | 8 |
| Tina Crown | 5/7/2004 | 10 |
SELECT SUM(Hours) FROM EmployeeHours; -- 結果:51
SELECT Employee, SUM(Hours) AS TotalHours
FROM EmployeeHours
GROUP BY Employee;
結果:
| Employee | TotalHours |
|---|---|
| John Smith | 25 |
| Allan Babel | 24 |
| Tina Crown | 27 |
SELECT Employee, AVG(Hours) AS AvgHours
FROM EmployeeHours
GROUP BY Employee;
-- 依日期再依員工分組
SELECT Date, Employee, SUM(Hours)
FROM EmployeeHours
GROUP BY Date, Employee;
SELECT Date, SUM(Hours) AS DailyTotal
FROM EmployeeHours
GROUP BY Date;
結果:
| Date | DailyTotal |
|---|---|
| 5/6/2004 | 24 |
| 5/7/2004 | 27 |
啟用 ONLY_FULL_GROUP_BY(MySQL 5.7+ 預設開啟)時,SELECT 清單只能包含:
GROUP BY 後的欄位)違反會報錯:ERROR 1055: 'col' isn't in GROUP BY。
GROUP BY 1, 2:用欄位位置編號(不建議,易讀性差)。GROUP BY ROLLUP / CUBE:產生超級彙總行(MySQL 8.0 支援)。HAVING 過濾群組(見前文)。