SQL GROUP BY

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 教學):

NameDepartmentSalary
張一業務部35000
王二資訊部42000
李三業務部38000
趙四資訊部45000
陳五人資部40000
林六業務部36000
黃七資訊部48000

依部門分組計算人數

使用 GROUP BY 搭配 COUNT() 函數,可以計算每個部門的員工人數。

SELECT Department, COUNT(*) AS headcount
FROM employees
GROUP BY Department;

查詢結果如下:

Departmentheadcount
業務部3
資訊部3
人資部1

依部門分組計算平均薪資

使用 GROUP BY 搭配 AVG() 函數,可以計算每個部門的平均薪資。

SELECT Department, AVG(Salary) AS avg_salary
FROM employees
GROUP BY Department;

查詢結果如下:

Departmentavg_salary
業務部36333
資訊部45000
人資部40000

依部門分組計算薪資總和

使用 GROUP BY 搭配 SUM() 函數,可以計算每個部門的薪資總和。

SELECT Department, SUM(Salary) AS total_salary
FROM employees
GROUP BY Department;

查詢結果如下:

Departmenttotal_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;

查詢結果如下:

Departmentheadcountavg_salary
業務部138000
資訊部345000
人資部140000

依多個欄位分組

GROUP BY 也可以同時指定多個欄位進行分組,資料會依據所有指定欄位的組合來分組。

SELECT Department, Salary, COUNT(*) AS count
FROM employees
GROUP BY Department, Salary;

查詢結果如下:

DepartmentSalarycount
業務部350001
業務部360001
業務部380001
資訊部420001
資訊部450001
資訊部480001
人資部400001

搭配 ORDER BY 排序分組結果

分組後的結果可以搭配 ORDER BY 進行排序,例如依照平均薪資由高到低排列。

SELECT Department, AVG(Salary) AS avg_salary
FROM employees
GROUP BY Department
ORDER BY avg_salary DESC;

查詢結果如下:

Departmentavg_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;

查詢結果如下:

Departmentheadcounttotal_salaryavg_salarymin_salarymax_salary
業務部3109000363333500038000
資訊部3135000450004200048000
人資部140000400004000040000

當你需要對分組後的結果進行篩選時,不能使用 WHERE(因為 WHERE 是在分組前執行的),而是要使用 HAVING 子句。想了解更多,請參閱 SQL HAVING 教學。

延伸閱讀