MySQL 集合函數(聚合函數)對行集合進行統計計算,常與 GROUP BY 配合實現分組統計。本文詳解五大核心函數語法、DISTINCT 去重、NULL 忽略規則、分組查詢陷阱與實戰範例。
| 函數 | 作用 | 忽略 NULL | 適用類型 |
|---|---|---|---|
COUNT(*) | 統計行數 | 否(統計所有行) | 任意 |
COUNT(col) | 統計非 NULL 個數 | 是 | 任意 |
AVG(col) | 平均值 | 是 | 數值型 |
SUM(col) | 求和 | 是 | 數值型 |
MAX(col) | 最大值 | 是 | 任意(可排序) |
MIN(col) | 最小值 | 是 | 任意(可排序) |
SELECT COUNT(*) FROM pet WHERE species='cat'; -- 2
SELECT COUNT(species) FROM pet; -- 9(含重複)
SELECT COUNT(DISTINCT species) FROM pet; -- 5(去重)
SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird | 2 |
| cat | 2 |
| dog | 3 |
| hamster | 1 |
| snake | 1 |
+---------+----------+
-- 站點投票平均分(1-10)
SELECT AVG(vote) FROM opinion;
-- 寵物品種平均年齡(天)
SELECT species, AVG(DATEDIFF(CURDATE(), birth)) FROM pet GROUP BY species;
+---------+----------------------------------+
| species | AVG(DATEDIFF(CURDATE(), birth)) |
+---------+----------------------------------+
| bird | 34160 |
| cat | 74959.5 |
| dog | 112829.66666667 |
| hamster | 19890 |
| snake | 49791 |
+---------+----------+
-- 訂單總金額
SELECT SUM(purchase_amount) FROM orders;
-- 同品種寵物年齡總和(對比平均值)
SELECT species, SUM(DATEDIFF(CURDATE(), birth)) FROM pet GROUP BY species;
+---------+----------------------------------+
| species | SUM(DATEDIFF(CURDATE(), birth)) |
+---------+----------------------------------+
| bird | 68320 |
| cat | 149919 |
| dog | 338489 |
| hamster | 19890 |
| snake | 49791 |
+---------+----------+
SELECT MIN(birth) FROM pet; -- 1989-05-13(最早出生)
-- 錯誤:name 非分組列
SELECT name, MIN(birth) FROM pet; -- ERROR 1140
SELECT species, MIN(birth) FROM pet GROUP BY species;
+---------+------------+
| species | MIN(birth) |
+---------+------------+
| bird | 1997-12-09 |
| cat | 1993-02-04 |
| dog | 1989-05-13 |
| hamster | 1999-03-30 |
| snake | 1996-04-29 |
+---------+------------+
SELECT species, MAX(birth) FROM pet GROUP BY species;
+---------+------------+
| species | MAX(birth) |
+---------+------------+
| bird | 1998-09-11 |
| cat | 1994-03-17 |
| dog | 1990-08-31 |
| hamster | 1999-03-30 |
| snake | 1996-04-29 |
+---------+------------+
COUNT(*) 除外)| 錯誤寫法 | 正確寫法 | 原因 |
|---|---|---|
SELECT name, COUNT(*) FROM pet | SELECT name, COUNT(*) FROM pet GROUP BY name | 非分組列 name 必須加入 GROUP BY |
SELECT species, AVG(weight) FROM pet WHERE AVG(weight) > 10 | SELECT species, AVG(weight) FROM pet GROUP BY species HAVING AVG(weight) > 10 | 聚合條件用 HAVING,不可用 WHERE |
SELECT COUNT(DISTINCT col1, col2) | SELECT COUNT(DISTINCT CONCAT(col1, ',', col2)) | MySQL 不支持多列 DISTINCT,需拼接 |
熟練掌握集合函數與 GROUP BY 組合,能高效完成各類統計報表、儀表盤數據、業務指標計算需求。