MySQL聚合函数详解:SUM、AVG、COUNT等核心用法与避坑指南

巷口听风
巷口听风
发布时间:2026-10-15 | 3人浏览过
原创

聚合函数是SQL中进行数据统计的核心工具,常用于计算总和、平均值、最大/最小值及记录数量。本文将深入讲解MySQL中SUM、MAX、MIN、AVG、COUNT五大核心聚合函数的具体语法与应用场景,结合员工数据表的实例演示如何准确获取统计结果,并重点解析聚合函数在WHERE子句中报错的根本原因及正确替代方案。

什么是聚合函数

聚合函数(Aggregate Functions),又称汇总函数,主要用于对一组数据进行统计计算,返回单个标量值。常见的应用场景包括求和、求平均值、寻找极值以及统计行数等。

在未指定分组的情况下,聚合函数的作用范围默认覆盖整张数据表。以下是一个求取平均工资的基础示例:

SELECT AVG(sal + IFNULL(comm,0)) AS 平均工资
FROM t_emp;

上述代码中,IFNULL(comm,0) 用于处理奖金字段可能为空的情况,若 comm 为 NULL,则将其视为 0 参与计算。关键提示:聚合函数的结果集始终只包含一行单条记录。

SUM 函数:数值求和

SUM() 函数用于计算数值类型的总和。需注意:SUM仅适用于数字类型;若作用于字符型数据,结果为0;若作用于时间类型,通常返回毫秒累加值。

第1步:统计指定部门的月薪总和

目标:统计部门编号为10和20的员工薪资总和。

SELECT SUM(sal)
FROM t_emp
WHERE deptno IN (10, 20);

第2步:非数值字段的求和测试

为了验证函数特性,尝试对姓名(字符串)字段进行求和:

SELECT SUM(ename)
FROM t_emp
WHERE deptno IN (10, 20);

运行结果通常为0,证明了该函数无法对非数值内容进行数学累加。

MAX 函数:获取最大值

MAX() 函数用于返回指定列中的非空最大值。它同样适用于日期、字符串(按字典序比较)和数值类型。

第1步:查找最高月收入

目标:找出10号和20号部门员工的最高月收入(含奖金)。

SELECT MAX(sal + IFNULL(comm,0)) AS max_sal
FROM t_emp
WHERE deptno IN (10, 20);

第2步:计算最长姓名的长度

利用嵌套函数,结合 LENGTH() 获取姓名字符串的最大长度:

SELECT MAX(LENGTH(ename)) AS length_ename
FROM t_emp;

MIN 函数:获取最小值

MIN() 与 MAX() 逻辑相反,用于返回非空值的最小值。常用于查找最早入职日期或最低薪资等场景。

第1步:查询最小员工编号

SELECT MIN(empno) AS min_empno
FROM t_emp;

第2步:查询最早入职日期

SELECT MIN(hiredate) AS min_hiredate
FROM t_emp;

AVG 函数:计算平均值

AVG() 用于计算非空值的算术平均值。与 SUM 类似,非数值字段的平均值为0。注意:AVG 自动忽略 NULL 值,分母仅为非空数据的数量。

示例:重新审视全文的平均薪资计算:

SELECT AVG(sal + IFNULL(comm,0)) AS 平均工资
FROM t_emp;

COUNT 函数:统计记录数

COUNT() 用于统计行数,根据括号内参数的不同,存在两种截然不同的行为模式:

  • COUNT(*):统计表中的总行数,包含 NULL 值。这是最常用的统计全表行数的方法。
  • COUNT(列名):统计指定列中非 NULL 值的行数。如果某行该列为 NULL,则不计入总数。

第1步:使用 COUNT(*) 统计全员

SELECT COUNT(*) FROM t_emp;

第2步:使用 COUNT(列名) 统计非空奖金人数

SELECT COUNT(comm) FROM t_emp;

对比两个结果,若表中存在奖金为空 (comm` IS NULL`) 的员工,两者的差值即为这些员工的数量。

综合练习与常见陷阱

练习1:多条件组合统计

需求:查询10号和20号部门中,底薪超过2000且工龄超过15年的员工人数。

实现思路:需结合 deptno 筛选、薪资判断以及日期计算函数。

SELECT COUNT(*) 
FROM t_emp
WHERE deptno IN (10, 20)
AND sal >= 2000
AND DATEDIFF(NOW(),hiredate)/365 >= 15;

重点警示:为什么 WHERE 不能放聚合函数?

许多初学者会尝试写出如下 SQL 来筛选“高于平均薪资”的员工:

-- ❌ 错误示范
SELECT * 
FROM t_emp
WHERE sal >= AVG(sal);

此类写法会在 MySQL 中引发语法错误。根本原因在于 SQL 的执行顺序:

  1. FROM → WHERE → GROUP BY → HAVING → ORDER BY → SELECT

解析: WHERE 子句的执行发生在聚合计算之前。当数据库引擎扫描到 WHERE 时,尚未形成完整的结果集,因此无法执行需要全局数据的聚合函数(如 AVG、SUM 等)。若要过滤经过聚合计算后的结果,必须使用 HAVING 子句(通常在 GROUP BY 之后使用)。

以上就是MySQL中聚合函数使用详细内容的介绍,更多关于MySQL高级查询技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表