MySQL聚合函数详解:SUM、AVG、COUNT等核心用法与避坑指南
聚合函数是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 的执行顺序:
FROM→WHERE→GROUP BY→HAVING→ORDER BY→SELECT
解析: WHERE 子句的执行发生在聚合计算之前。当数据库引擎扫描到 WHERE 时,尚未形成完整的结果集,因此无法执行需要全局数据的聚合函数(如 AVG、SUM 等)。若要过滤经过聚合计算后的结果,必须使用 HAVING 子句(通常在 GROUP BY 之后使用)。
以上就是MySQL中聚合函数使用详细内容的介绍,更多关于MySQL高级查询技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









