在 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 聚合函數