本文 AI 產出,尚未審核
MySQL 課程 – 聚合函式與分組
主題:COUNT / SUM / AVG
簡介
在資料庫的日常查詢中,統計資訊是最常見的需求之一。無論是要了解訂單筆數、計算營收總額,或是求出平均分數,聚合函式(Aggregate Functions)都是不可或缺的工具。
本單元將聚焦於三個最常使用的聚合函式 COUNT、SUM、AVG,說明它們的語法、運作原理,以及在分組(GROUP BY)情境下的應用。掌握這些概念後,你就能快速從龐大的資料表中萃取出有價值的彙總資訊,為報表、分析或決策提供可靠依據。
核心概念
1. COUNT:計算列數
COUNT() 用來統計符合條件的列數,常見的兩種寫法:
| 用法 | 說明 |
|---|---|
COUNT(*) |
計算 所有 行,包括 NULL |
COUNT(col) |
只統計 非 NULL 的 col 值 |
範例 1:統計全部訂單筆數
SELECT COUNT(*) AS total_orders
FROM orders;
這裡的
COUNT(*)會把orders表的每一筆記錄都算進去,即使某些欄位為NULL也不影響。
範例 2:統計有付款金額的訂單
SELECT COUNT(payment_amount) AS paid_orders
FROM orders
WHERE payment_amount IS NOT NULL;
COUNT(payment_amount)只會把payment_amount不為NULL的列列入計算。
2. SUM:加總數值
SUM() 只能對數值型別的欄位進行加總,NULL 會自動忽略。
範例 3:計算本月營收總額
SELECT SUM(payment_amount) AS month_revenue
FROM orders
WHERE order_date BETWEEN '2025-11-01' AND '2025-11-30';
若某筆訂單的
payment_amount為NULL,它不會影響總和。
範例 4:分店營收加總(結合 GROUP BY)
SELECT store_id,
SUM(payment_amount) AS store_revenue
FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY store_id
ORDER BY store_revenue DESC;
先以
store_id分組,再分別計算每家分店的營收,最後依營收高低排序。
3. AVG:算術平均值
AVG() 會先把非 NULL 的數值加總,再除以計算的筆數。
範例 5:求出每位客服的平均處理時間
SELECT agent_id,
AVG(TIMESTAMPDIFF(MINUTE, created_at, closed_at)) AS avg_handle_min
FROM tickets
WHERE status = 'closed'
GROUP BY agent_id;
TIMESTAMPDIFF產生的是分鐘數,AVG直接算出每位客服的平均處理分鐘數。
常見陷阱與最佳實踐
| 陷阱 | 說明 | 最佳實踐 |
|---|---|---|
忘記排除 NULL |
COUNT(col) 只會算非 NULL,若欄位本身可能為 NULL,結果會低於預期。 |
使用 COUNT(*) 或在 WHERE 子句中明確過濾 NULL。 |
| 聚合與非聚合欄位混用 | 在 SELECT 中同時出現聚合函式與未在 GROUP BY 的欄位會產生錯誤。 |
確保所有非聚合欄位都列於 GROUP BY,或使用聚合子查詢。 |
| 資料類型不匹配 | SUM()、AVG() 只能作用於數值型別,對文字或日期會報錯。 |
先使用 CAST() 或 CONVERT() 把欄位轉成適當的數值型別。 |
| 大資料量的性能問題 | 直接在大表上做 SUM、AVG 可能導致全表掃描。 |
建立適當的索引(如 order_date、store_id),或使用物化視圖(Materialized View)快取彙總結果。 |
| 精度遺失 | AVG() 產生的結果會根據欄位的數值精度自動四捨五入。 |
若需更高精度,可先 CAST 為 DECIMAL(15,4) 再計算。 |
實際應用場景
每日營收報表
- 透過
SUM(payment_amount)搭配GROUP BY DATE(order_date),產出每日營收曲線,供財務人員快速檢視。
- 透過
活躍用戶統計
- 使用
COUNT(DISTINCT user_id)計算特定期間內的活躍使用者數,協助行銷團隊評估活動成效。
- 使用
產品品質分析
AVG(rating)結合GROUP BY product_id,找出評分偏低的商品,作為品質改進的依據。
客服效能監控
AVG(TIMESTAMPDIFF(SECOND, created_at, closed_at))計算每位客服的平均處理秒數,幫助管理層調整工作負荷。
總結
- COUNT、SUM、AVG 是 MySQL 最常用的三大聚合函式,分別負責計數、加總與平均。
- 搭配 GROUP BY 能夠把資料依特定欄位分組,產生多維度的彙總結果。
- 使用時要注意
NULL處理、資料型別相容性以及可能的性能瓶頸,適時加入索引或物化視圖可提升查詢效能。 - 透過這些聚合函式,你可以快速產出營收報表、用戶活躍度、產品評分等關鍵指標,為業務決策提供即時、可靠的數據支撐。
掌握本單元內容後,建議在自己的專案或測試資料庫中多加練習,從簡單的單表統計到多表聯合彙總,逐步提升對 聚合與分組 的熟練度。祝你在 MySQL 的世界裡,統計無往不利!