SQL 聚合函數

聚合函數 (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 教學):

NameDepartmentSalary
張一業務部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;

查詢結果如下:

Departmentheadcountavg_salary
業務部236500
資訊部243500
人資部140000

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;

查詢結果如下:

Departmentheadcountmax_salary
業務部240000
資訊部245000
人資部140000

搭配 HAVING 篩選分組結果

當我們需要對分組後的聚合結果進行篩選時,不能使用 WHERE,因為 WHERE 是在分組前篩選資料列。此時需要使用 HAVING 子句,它可以針對聚合函數的計算結果進行條件篩選。

SELECT Department, COUNT(*) AS headcount, AVG(Salary) AS avg_salary
FROM employees
GROUP BY Department
HAVING COUNT(*) >= 2;

查詢結果如下(只顯示員工人數 >= 2 的部門):

Departmentheadcountavg_salary
業務部236500
資訊部243500

想了解更多 GROUP BY 的進階用法,請參閱 SQL GROUP BY 完整教學。

延伸閱讀

留言功能已關閉。