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

MySQL 聚合函數完全指南:AVG/COUNT/MIN/MAX/SUM/GROUP_CONCAT 詳解

     編輯:MySQL 資料庫相關知識

五大基礎聚合函數

函數說明忽略 NULL
AVG(col)平均值是
COUNT(col)非 NULL 個數是
MIN(col)最小值是
MAX(col)最大值是
SUM(col)總和是

注意:COUNT(*) 統計行數(含 NULL),COUNT(col) 統計該列非 NULL 個數。

進階聚合:GROUP_CONCAT

將分組內的列值拼接為字符串,極其實用。

GROUP_CONCAT([DISTINCT] expr [,expr ...]
  [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]]
  [SEPARATOR str_val])

實戰示例

-- 基本用法:分組拼接姓名
SELECT dept_id, GROUP_CONCAT(name) FROM employee GROUP BY dept_id;

-- 自定義分隔符
SELECT dept_id, GROUP_CONCAT(name SEPARATOR ';') FROM employee GROUP BY dept_id;

-- 排序後拼接
SELECT dept_id, GROUP_CONCAT(name ORDER BY hire_date) FROM employee GROUP BY dept_id;

-- 組合:去重 + 排序 + 分隔符
SELECT dept_id, GROUP_CONCAT(DISTINCT name ORDER BY name SEPARATOR '|') FROM employee GROUP BY dept_id;

配合 GROUP BY 使用

SELECT 
  dept_id,
  COUNT(*) AS emp_count,
  AVG(salary) AS avg_salary,
  MIN(salary) AS min_salary,
  MAX(salary) AS max_salary,
  SUM(salary) AS total_salary,
  GROUP_CONCAT(name ORDER BY salary DESC SEPARATOR ',') AS top_earners
FROM employee
GROUP BY dept_id;

進階技巧

  • 條件聚合:SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) AS active_count
  • 分位數近似:MySQL 8.0+ 支持 PERCENTILE_CONT、PERCENTILE_DISC。
  • GROUP_CONCAT 默認最大長度 1024 字節,超長會截斷,可調整:
    SET SESSION group_concat_max_len = 10000;
  • JSON 聚合 (5.7+):JSON_ARRAYAGG(col)、JSON_OBJECTAGG(key, val) 直接生成 JSON 結構。

性能優化建議

  • 聚合查詢確保 GROUP BY 列有索引。
  • 大表聚合考慮使用 WITH ROLLUP 生成多維小計。
  • 避免在聚合列上使用函數(如 SUM(LENGTH(name))),阻礙索引使用。

掌握這六個聚合函數,覆蓋從簡單統計到複雜報表的絕大多數需求。

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