本文 AI 產出,尚未審核

MySQL 課程 – 聚合函式與分組

主題:COUNT / SUM / AVG


簡介

在資料庫的日常查詢中,統計資訊是最常見的需求之一。無論是要了解訂單筆數、計算營收總額,或是求出平均分數,聚合函式(Aggregate Functions)都是不可或缺的工具。
本單元將聚焦於三個最常使用的聚合函式 COUNT、SUM、AVG,說明它們的語法、運作原理,以及在分組(GROUP BY)情境下的應用。掌握這些概念後,你就能快速從龐大的資料表中萃取出有價值的彙總資訊,為報表、分析或決策提供可靠依據。


核心概念

1. COUNT:計算列數

COUNT() 用來統計符合條件的列數,常見的兩種寫法:

用法 說明
COUNT(*) 計算 所有 行,包括 NULL
COUNT(col) 只統計 非 NULLcol

範例 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_amountNULL,它不會影響總和。

範例 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() 把欄位轉成適當的數值型別。
大資料量的性能問題 直接在大表上做 SUMAVG 可能導致全表掃描。 建立適當的索引(如 order_datestore_id),或使用物化視圖(Materialized View)快取彙總結果。
精度遺失 AVG() 產生的結果會根據欄位的數值精度自動四捨五入。 若需更高精度,可先 CASTDECIMAL(15,4) 再計算。

實際應用場景

  1. 每日營收報表

    • 透過 SUM(payment_amount) 搭配 GROUP BY DATE(order_date),產出每日營收曲線,供財務人員快速檢視。
  2. 活躍用戶統計

    • 使用 COUNT(DISTINCT user_id) 計算特定期間內的活躍使用者數,協助行銷團隊評估活動成效。
  3. 產品品質分析

    • AVG(rating) 結合 GROUP BY product_id,找出評分偏低的商品,作為品質改進的依據。
  4. 客服效能監控

    • AVG(TIMESTAMPDIFF(SECOND, created_at, closed_at)) 計算每位客服的平均處理秒數,幫助管理層調整工作負荷。

總結

  • COUNTSUMAVG 是 MySQL 最常用的三大聚合函式,分別負責計數、加總與平均。
  • 搭配 GROUP BY 能夠把資料依特定欄位分組,產生多維度的彙總結果。
  • 使用時要注意 NULL 處理、資料型別相容性以及可能的性能瓶頸,適時加入索引或物化視圖可提升查詢效能。
  • 透過這些聚合函式,你可以快速產出營收報表、用戶活躍度、產品評分等關鍵指標,為業務決策提供即時、可靠的數據支撐。

掌握本單元內容後,建議在自己的專案或測試資料庫中多加練習,從簡單的單表統計到多表聯合彙總,逐步提升對 聚合與分組 的熟練度。祝你在 MySQL 的世界裡,統計無往不利!