聚合函數 COUNT、SUM、AVG
什麼是聚合函數?
比喻:聚合函數就像統計老師 👨🏫
班上 30 個學生的成績單攤開在桌上, 統計老師幫你算「有幾個人」、「平均幾分」、「最高幾分」—— 這就是聚合函數在做的事。
聚合函數會把多筆資料算成一個結果。
COUNT — 計算筆數
-- 計算學生總人數
SELECT COUNT(*) AS 學生人數 -- ← COUNT(*) 計算所有列
FROM Students;
-- 結果:30
-- 計算有填 Email 的學生數
SELECT COUNT(Email) AS 有Email人數 -- ← COUNT(欄位) 不計 NULL
FROM Students;
-- 如果有 5 人沒填 Email → 結果:25
-- 計算有幾種不同的年齡
SELECT COUNT(DISTINCT Age) AS 年齡種類數
FROM Students;
-- 如果有 20, 21, 22 三種 → 結果:3
逐行解析:
COUNT(*) -- 計算所有列數(包含 NULL)
COUNT(Email) -- 計算 Email 不是 NULL 的列數
COUNT(DISTINCT Age) -- 先去重複,再計算有幾種
SUM — 加總
-- 全班分數總和
SELECT SUM(Score) AS 分數總和
FROM Students;
-- 及格學生的分數總和
SELECT SUM(Score) AS 及格分數總和
FROM Students
WHERE Score >= 60;
⚠️ SUM 只能用在數字欄位。用在字串上會出錯。
AVG — 平均
-- 全班平均分數
SELECT AVG(Score) AS 平均分 -- ← 自動計算:SUM / COUNT
FROM Students;
-- 四捨五入到小數第 2 位
SELECT ROUND(AVG(Score), 2) AS 平均分
FROM Students;
MAX / MIN — 最大最小值
-- 最高分和最低分
SELECT MAX(Score) AS 最高分, -- ← 全班最高分
MIN(Score) AS 最低分 -- ← 全班最低分
FROM Students;
-- 也可以用在日期
SELECT MAX(CreatedAt) AS 最新註冊時間,
MIN(CreatedAt) AS 最早註冊時間
FROM Students;
-- 也可以用在字串(按字母順序)
SELECT MAX(Name) AS 最後名字, -- 字母排序最後的
MIN(Name) AS 最前名字 -- 字母排序最前的
FROM Students;
組合使用
-- 一次看所有統計資料
SELECT
COUNT(*) AS 總人數,
SUM(Score) AS 分數總和,
ROUND(AVG(Score), 2) AS 平均分,
MAX(Score) AS 最高分,
MIN(Score) AS 最低分,
MAX(Score) - MIN(Score) AS 分數差距 -- ← 可以做運算
FROM Students;
結果:
總人數 | 分數總和 | 平均分 | 最高分 | 最低分 | 分數差距
-------+---------+-------+-------+-------+---------
30 | 2250 | 75.00 | 98 | 32 | 66
搭配 WHERE 使用
-- 統計各個條件下的數據
SELECT COUNT(*) AS 及格人數
FROM Students
WHERE Score >= 60;
SELECT AVG(Score) AS 女生平均分
FROM Students
WHERE Gender = '女';
SELECT MAX(Age) AS 最大年齡
FROM Students
WHERE Department = '資工系';
小結
| 函數 | 用途 | NULL 處理 |
|---|---|---|
COUNT(*) |
計算總列數 | 包含 NULL |
COUNT(col) |
計算非空列數 | 忽略 NULL |
SUM(col) |
加總 | 忽略 NULL |
AVG(col) |
平均 | 忽略 NULL |
MAX(col) |
最大值 | 忽略 NULL |
MIN(col) |
最小值 | 忽略 NULL |
💡 下一章學 GROUP BY,讓聚合函數發揮真正威力!