GROUP BY 分組 (SQL GROUP BY)
這篇 SQL GROUP BY 教學將帶你認識 GROUP BY 子句的基本概念與用法。GROUP BY 用來將查詢結果依據指定欄位進行分組,通常搭配聚合函數(如 COUNT、SUM、AVG、MIN、MAX)一起使用,對每個分組分別進行統計計算。
當你需要按照某個欄位(例如部門、類別、地區等)來彙總資料時,GROUP BY 就是最重要的工具。它會將相同值的資料列歸為同一組,再對每一組套用聚合函數,回傳每組的計算結果。
GROUP BY 語法 (SQL GROUP BY Syntax)
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name;
說明:
| 關鍵字 | 說明 |
|---|---|
| SELECT | 指定要查詢的欄位與聚合函數 |
| FROM | 指定資料來源的資料表 |
| WHERE | (選填)在分組前先篩選資料列 |
| GROUP BY | 指定用來分組的欄位 |
GROUP BY 用法 (Example)
假設我們有一個員工資料表 employees 如下(若需了解如何建立資料表,請參考 CREATE TABLE 教學):
| Name | Department | Salary |
|---|---|---|
| 張一 | 業務部 | 35000 |
| 王二 | 資訊部 | 42000 |
| 李三 | 業務部 | 38000 |
| 趙四 | 資訊部 | 45000 |
| 陳五 | 人資部 | 40000 |
| 林六 | 業務部 | 36000 |
| 黃七 | 資訊部 | 48000 |
依部門分組計算人數
使用 GROUP BY 搭配 COUNT() 函數,可以計算每個部門的員工人數。
SELECT Department, COUNT(*) AS headcount
FROM employees
GROUP BY Department;
查詢結果如下:
| Department | headcount |
|---|---|
| 業務部 | 3 |
| 資訊部 | 3 |
| 人資部 | 1 |
依部門分組計算平均薪資
使用 GROUP BY 搭配 AVG() 函數,可以計算每個部門的平均薪資。
SELECT Department, AVG(Salary) AS avg_salary
FROM employees
GROUP BY Department;
查詢結果如下:
| Department | avg_salary |
|---|---|
| 業務部 | 36333 |
| 資訊部 | 45000 |
| 人資部 | 40000 |
依部門分組計算薪資總和
使用 GROUP BY 搭配 SUM() 函數,可以計算每個部門的薪資總和。
SELECT Department, SUM(Salary) AS total_salary
FROM employees
GROUP BY Department;
查詢結果如下:
| Department | total_salary |
|---|---|
| 業務部 | 109000 |
| 資訊部 | 135000 |
| 人資部 | 40000 |
搭配 WHERE 篩選後再分組
可以先用 WHERE 篩選資料列,再用 GROUP BY 進行分組。WHERE 會在分組之前執行,只有符合條件的資料才會被納入分組。
SELECT Department, COUNT(*) AS headcount, AVG(Salary) AS avg_salary
FROM employees
WHERE Salary >= 38000
GROUP BY Department;
查詢結果如下:
| Department | headcount | avg_salary |
|---|---|---|
| 業務部 | 1 | 38000 |
| 資訊部 | 3 | 45000 |
| 人資部 | 1 | 40000 |
依多個欄位分組
GROUP BY 也可以同時指定多個欄位進行分組,資料會依據所有指定欄位的組合來分組。
SELECT Department, Salary, COUNT(*) AS count
FROM employees
GROUP BY Department, Salary;
查詢結果如下:
| Department | Salary | count |
|---|---|---|
| 業務部 | 35000 | 1 |
| 業務部 | 36000 | 1 |
| 業務部 | 38000 | 1 |
| 資訊部 | 42000 | 1 |
| 資訊部 | 45000 | 1 |
| 資訊部 | 48000 | 1 |
| 人資部 | 40000 | 1 |
搭配 ORDER BY 排序分組結果
分組後的結果可以搭配 ORDER BY 進行排序,例如依照平均薪資由高到低排列。
SELECT Department, AVG(Salary) AS avg_salary
FROM employees
GROUP BY Department
ORDER BY avg_salary DESC;
查詢結果如下:
| Department | avg_salary |
|---|---|
| 資訊部 | 45000 |
| 人資部 | 40000 |
| 業務部 | 36333 |
搭配多個聚合函數
在同一個查詢中,可以同時使用多個聚合函數來取得不同的統計資訊。
SELECT Department,
COUNT(*) AS headcount,
SUM(Salary) AS total_salary,
AVG(Salary) AS avg_salary,
MIN(Salary) AS min_salary,
MAX(Salary) AS max_salary
FROM employees
GROUP BY Department;
查詢結果如下:
| Department | headcount | total_salary | avg_salary | min_salary | max_salary |
|---|---|---|---|---|---|
| 業務部 | 3 | 109000 | 36333 | 35000 | 38000 |
| 資訊部 | 3 | 135000 | 45000 | 42000 | 48000 |
| 人資部 | 1 | 40000 | 40000 | 40000 | 40000 |
當你需要對分組後的結果進行篩選時,不能使用 WHERE(因為 WHERE 是在分組前執行的),而是要使用 HAVING 子句。想了解更多,請參閱 SQL HAVING 教學。
延伸閱讀
- SQL 聚合函數
- SQL HAVING
- SQL SELECT
- SQL WHERE
- SQL ORDER BY
- SQL Subquery
- SQL JOIN
- SQL CASE
- SQL DISTINCT
- SQL AS