SQL 聚合函數(Aggregate Functions)詳解
更新日期: 2025 年 3 月 4 日
在 SQL 中,聚合函數(Aggregate Functions) 是用來對多筆資料進行計算的函數,能夠幫助我們快速獲取統計資訊。例如:
- 計算總數(COUNT)
- 求總和(SUM)
- 計算平均值(AVG)
- 找出最大值(MAX)與最小值(MIN)
這些函數在資料分析、報表生成和數據處理中都非常重要。本篇文章將詳細介紹 SQL 常見的聚合函數、使用方式,以及如何搭配 GROUP BY
和 HAVING
來進行進階查詢。
什麼是 SQL 聚合函數?
「聚合」這個詞的英文是 “Aggregate”,它的意思是「集合、合併、彙總」。
在 SQL 中,聚合函數(Aggregate Functions)之所以被這樣命名,是因為它們的主要作用就是對多筆數據進行合併計算,並返回單一結果。
這些函數不會影響原始數據,而是對數據進行統計計算。
具體來說,SQL 聚合函數的「聚合」含義包括:
- 將多筆資料組合在一起,並產生一個總結值
SUM()
會將某個欄位的所有數值加總,返回一個總和AVG()
會將所有數值相加後取平均值COUNT()
會統計資料筆數
- 分組計算(GROUP BY)時,將數據按類別彙總後進行計算
- 例如,統計每個客戶的購買總額時,SQL 會先按照客戶 ID 分組,然後再對每組內的數據進行聚合計算。
- 只返回「單一」結果
- 和一般的 SQL 查詢不同,聚合函數不是返回多筆記錄,而是將多筆記錄「合併」為單一結果。
常見的 SQL 聚合函數包括:
函數 | 說明 |
---|---|
COUNT() | 計算資料筆數 |
SUM() | 計算總和 |
AVG() | 計算平均值 |
MAX() | 取得最大值 |
MIN() | 取得最小值 |
COUNT()
:計算資料筆數
用途
COUNT()
用來計算某個欄位中不為 NULL 的資料筆數,或者統計整個表格中的記錄數。
範例
假設我們有一張 Orders
表:
OrderID | CustomerID | TotalAmount |
---|---|---|
1 | 101 | 200 |
2 | 102 | 150 |
3 | 103 | NULL |
4 | 101 | 300 |
5 | NULL | 400 |
計算總筆數
SELECT COUNT(*) AS TotalOrders FROM Orders;
🔹 結果: TotalOrders = 5
計算 CustomerID
不為 NULL 的筆數
SELECT COUNT(CustomerID) AS TotalCustomers FROM Orders;
🔹 結果: TotalCustomers = 4
(因為 CustomerID
有一筆是 NULL
)
SUM()
:計算總和
用途
SUM()
用來計算數值型欄位的總和,通常用於銷售金額、工資、訂單數量等累積計算。
範例
計算所有訂單的總金額:
SELECT SUM(TotalAmount) AS TotalRevenue FROM Orders;
🔹 結果: TotalRevenue = 1050
(忽略 NULL
值)
AVG()
:計算平均值
用途
AVG()
用來計算某個數值欄位的平均值,通常用於薪資、評分、銷售金額等數據分析。
範例
計算訂單的平均金額:
SELECT AVG(TotalAmount) AS AverageOrderValue FROM Orders;
🔹 結果: AverageOrderValue = 262.5
(計算時忽略 NULL
值)
MAX()
& MIN()
:取得最大值與最小值
用途
MAX()
返回指定欄位的最大值MIN()
返回指定欄位的最小值
範例
查詢最高與最低的訂單金額
SELECT MAX(TotalAmount) AS HighestOrder, MIN(TotalAmount) AS LowestOrder FROM Orders;
🔹 結果:
HighestOrder | LowestOrder |
---|---|
400 | 150 |
搭配 GROUP BY
進行分組統計
聚合函數通常與 GROUP BY
一起使用,來針對不同分類進行統計計算。
範例:計算每個客戶的訂單總金額
SELECT CustomerID, SUM(TotalAmount) AS TotalSpent
FROM Orders
GROUP BY CustomerID;
🔹 結果:
CustomerID | TotalSpent |
---|---|
101 | 500 |
102 | 150 |
103 | 0 (NULL) |
🔸 GROUP BY
讓我們可以按 CustomerID
分組,然後計算每個客戶的訂單總額。
搭配 HAVING
來篩選統計結果
如果我們想篩選出 訂單總額超過 200 的客戶,可以使用 HAVING
:
SELECT CustomerID, SUM(TotalAmount) AS TotalSpent
FROM Orders
GROUP BY CustomerID
HAVING SUM(TotalAmount) > 200;
🔹 結果:
CustomerID | TotalSpent |
---|---|
101 | 500 |
💡 注意:WHERE
不能用於 SUM()
、AVG()
等聚合函數,因為 WHERE
在分組前篩選,而 HAVING
則是在分組後篩選結果。
COUNT(DISTINCT)
:計算唯一值數量
如果我們想知道有多少 不同的客戶 下過訂單,可以使用:
SELECT COUNT(DISTINCT CustomerID) AS UniqueCustomers FROM Orders;
🔹 結果: UniqueCustomers = 3
聚合函數的常見問題
COUNT(*)
vs COUNT(column)
COUNT(*)
:計算表內所有記錄的筆數(包括NULL
)COUNT(column)
:計算該欄位內非 NULL 值的筆數
NULL
值的影響
SUM()
,AVG()
,MAX()
,MIN()
會忽略NULL
值COUNT(column)
也不會計算NULL
值- 若想將
NULL
當作 0 計算,可以使用COALESCE(column, 0)
SELECT SUM(COALESCE(TotalAmount, 0)) AS TotalRevenue FROM Orders;
結語
SQL 聚合函數 是數據分析和報表製作中最常用的工具之一,能夠幫助我們快速統計數據:
COUNT()
:計算筆數SUM()
:計算總和AVG()
:計算平均值MAX()
&MIN()
:取得最大值與最小值- 搭配
GROUP BY
&HAVING
進行分組統計
透過這些函數,你可以輕鬆進行數據分析,讓查詢結果更具商業價值!希望這篇文章能幫助你更好地理解 SQL 聚合函數