331 字
2 分钟
MySQL学习笔记 (6)
2026-08-30
NOTE

基于 MySQL 26.7。聚合函数

聚合函数#

聚合函数对一组值进行计算,返回单个值。

函数描述
COUNT(*)行数
COUNT(col)col 不是 NULL 的个数
COUNT(DISTINCT col)去重后的个数
SUM(expr)合计
AVG(expr)平均值
MIN(expr)最小值
MAX(expr)最大值
SELECT COUNT(*) AS n_emp,
COUNT(manager_id) AS n_with_mgr,
AVG(salary) AS avg_sal
FROM employee;

没有 GROUP BY 时,整张表(经过 WHERE 之后)算作一组。

COUNT(phone) 只统计填了手机号的行;COUNT(*) 统计所有行。

GROUP BY#

GROUP BY 用于结合聚合函数,按一个或多个列分组。

SELECT dept_no, COUNT(*) AS n, AVG(salary) AS avg_sal
FROM employee
GROUP BY dept_no;

SELECT 里没有用聚合函数的列,一般要出现在 GROUP BY 中。下面这样是不对的:按部门分组,却直接选出每个人的姓名。

SELECT dept_no, last_name, COUNT(*)
FROM employee
GROUP BY dept_no;

按多列分组:

GROUP BY dept_no, job_id

WHERE 在分组之前筛选行。分组之后的条件要用 HAVING

HAVING#

HAVING 用于筛选分组后的结果。

SELECT dept_no, COUNT(*) AS n
FROM employee
WHERE salary >= 3000
GROUP BY dept_no
HAVING COUNT(*) >= 2
ORDER BY n DESC;

HAVING 里可以使用聚合函数,WHERE 里不行。

NULL 和聚合#

分组键是 NULL 的行会分到同一组。

某一组里 SUM 的值全是 NULL 时,结果是 NULL,不是 0。需要显示 0 时可以写成:

COALESCE(SUM(amount), 0)

参考#

  1. MySQL 26.7 · Aggregate Functions
  2. MySQL 26.7 · GROUP BY
  3. MySQL 26.7 · SELECT
  4. ISO/IEC 9075(SQL<2023>
MySQL学习笔记 (6)
https://blog.chuwu.top/posts/sql/mysql6/
作者
ChuwuYo
发布于
2026-08-30
许可协议
CC BY-NC-SA 4.0