聚合函數 (SQL Aggregate Functions)
這篇 SQL 聚合函數教學將帶你認識聚合函數的基本概念。聚合函數是對一組值執行計算,並返回單一值的函數。聚合函數經常與 SELECT 語句的 GROUP BY 子句一同使用。
以下是 SQL 中常用的聚合函數:
| 函數 | 說明 |
|---|---|
| COUNT() | 計算列數 |
| SUM() | 計算總和 |
| AVG() | 計算平均值 |
| MIN() | 取得最小值 |
| MAX() | 取得最大值 |
聚合函數語法 (SQL Aggregate Functions Syntax)
SELECT aggregate_function(column_name)
FROM table_name
WHERE condition;
聚合函數用法 (Example)
假設我們有一個員工資料表 employees 如下(若需了解如何建立資料表,請參考 CREATE TABLE 教學):
| Name | Department | Salary |
|---|---|---|
| 張一 | 業務部 | 35000 |
| 王二 | 資訊部 | 42000 |
| 李三 | 業務部 | 38000 |
| 趙四 | 資訊部 | 45000 |
| 陳五 | 人資部 | 40000 |
COUNT() 函數
COUNT() 用來計算符合條件的資料列數。
SELECT COUNT(*) AS total_employees
FROM employees;
查詢結果如下:
| total_employees |
|---|
| 5 |
SUM() 函數
SUM() 用來計算數值欄位的總和。
SELECT SUM(Salary) AS total_salary
FROM employees;
查詢結果如下:
| total_salary |
|---|
| 200000 |
AVG() 函數
AVG() 用來計算數值欄位的平均值。
SELECT AVG(Salary) AS avg_salary
FROM employees;
查詢結果如下:
| avg_salary |
|---|
| 40000 |
MIN() 函數
MIN() 用來取得欄位中的最小值。
SELECT MIN(Salary) AS min_salary
FROM employees;
查詢結果如下:
| min_salary |
|---|
| 35000 |
MAX() 函數
MAX() 用來取得欄位中的最大值。
SELECT MAX(Salary) AS max_salary
FROM employees;
查詢結果如下:
| max_salary |
|---|
| 45000 |
搭配 GROUP BY 使用
聚合函數經常搭配 GROUP BY 子句來對分組後的資料進行統計計算。GROUP BY 會將資料依照指定的欄位進行分組,再對每個分組分別執行聚合函數,最終回傳每個分組的計算結果。
SELECT Department, COUNT(*) AS headcount, AVG(Salary) AS avg_salary
FROM employees
GROUP BY Department;
查詢結果如下:
| Department | headcount | avg_salary |
|---|---|---|
| 業務部 | 2 | 36500 |
| 資訊部 | 2 | 43500 |
| 人資部 | 1 | 40000 |
GROUP BY 的基本語法如下,將想要分組的欄位放在 GROUP BY 後方,並在 SELECT 中搭配聚合函數:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name;
例如,想要查詢每個部門的員工人數與最高薪資,可以這樣寫:
SELECT Department, COUNT(*) AS headcount, MAX(Salary) AS max_salary
FROM employees
GROUP BY Department;
查詢結果如下:
| Department | headcount | max_salary |
|---|---|---|
| 業務部 | 2 | 40000 |
| 資訊部 | 2 | 45000 |
| 人資部 | 1 | 40000 |
搭配 HAVING 篩選分組結果
當我們需要對分組後的聚合結果進行篩選時,不能使用 WHERE,因為 WHERE 是在分組前篩選資料列。此時需要使用 HAVING 子句,它可以針對聚合函數的計算結果進行條件篩選。
SELECT Department, COUNT(*) AS headcount, AVG(Salary) AS avg_salary
FROM employees
GROUP BY Department
HAVING COUNT(*) >= 2;
查詢結果如下(只顯示員工人數 >= 2 的部門):
| Department | headcount | avg_salary |
|---|---|---|
| 業務部 | 2 | 36500 |
| 資訊部 | 2 | 43500 |
想了解更多 GROUP BY 的進階用法,請參閱 SQL GROUP BY 完整教學。
留言功能已關閉。