首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 高級特性:集合函數(COUNT、AVG、SUM、MAX、MIN)與 GROUP BY 實戰詳解

     編輯:MySQL 資料庫相關知識

MySQL 集合函數(聚合函數)對行集合進行統計計算,常與 GROUP BY 配合實現分組統計。本文詳解五大核心函數語法、DISTINCT 去重、NULL 忽略規則、分組查詢陷阱與實戰範例。

一、五大核心集合函數

函數作用忽略 NULL適用類型
COUNT(*)統計行數否(統計所有行)任意
COUNT(col)統計非 NULL 個數是任意
AVG(col)平均值是數值型
SUM(col)求和是數值型
MAX(col)最大值是任意(可排序)
MIN(col)最小值是任意(可排序)

二、COUNT 進階用法

1. 基礎計數


SELECT COUNT(*) FROM pet WHERE species='cat';  -- 2
SELECT COUNT(species) FROM pet;                -- 9(含重複)
SELECT COUNT(DISTINCT species) FROM pet;       -- 5(去重)

2. 分組統計


SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird    | 2        |
| cat     | 2        |
| dog     | 3        |
| hamster | 1        |
| snake   | 1        |
+---------+----------+

三、AVG 平均值實戰


-- 站點投票平均分(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                            |
+---------+----------+

四、SUM 求和實戰


-- 訂單總金額
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                            |
+---------+----------+

五、MAX/MIN 極值實戰

1. 單表極值


SELECT MIN(birth) FROM pet;  -- 1989-05-13(最早出生)

2. 陷阱:非分組列無法直接搭配極值


-- 錯誤:name 非分組列
SELECT name, MIN(birth) FROM pet;  -- ERROR 1140

3. 正確:分組極值


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 |
+---------+------------+

六、核心規則總結

  1. 集合函數只返回單值(標量),不可與非分組列直接混用
  2. GROUP BY 列 可直接出現在 SELECT 列表,**非 GROUP BY 列必須包裹在集合函數中**
  3. NULL 值被所有集合函數忽略**(COUNT(*) 除外)
  4. DISTINCT 可用於 COUNT、SUM、AVG** 去重計算
  5. WHERE 過濾在分組前,HAVING 過濾在分組後**(聚合條件用 HAVING)

七、實戰避坑

錯誤寫法正確寫法原因
SELECT name, COUNT(*) FROM petSELECT name, COUNT(*) FROM pet GROUP BY name非分組列 name 必須加入 GROUP BY
SELECT species, AVG(weight) FROM pet WHERE AVG(weight) > 10SELECT 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 組合,能高效完成各類統計報表、儀表盤數據、業務指標計算需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved