AVG()和SUM()可并列出现在同一SELECT语句中,无需嵌套子查询,二者在GROUP BY分组内独立计算;错误写法如AVG(SUM(x))非法,因聚合函数不可互相嵌套。

GROUP BY 后直接用 AVG() 和 SUM() 一起写就行
不需要嵌套子查询或临时表,AVG() 和 SUM() 可以并列出现在同一 SELECT 语句中,只要它们作用于同一分组逻辑。数据库引擎会在每个分组内独立计算这两个聚合值。
常见错误是误以为要先算平均再算总和,或者试图用 AVG(SUM(x)) 这类非法写法——AVG() 和 SUM() 都是行级聚合函数,不能互相嵌套。
SELECT dept, AVG(salary), SUM(salary) FROM employees GROUP BY dept;- 如果某组只有 1 条记录,
AVG()和SUM()结果数值相同,但语义不同,别混淆 - 空值(
NULL)会被自动忽略:既不参与SUM()计数,也不计入AVG()的分母
需要保留小数位数时,注意数据库的默认精度差异
AVG() 在不同数据库里返回类型不一样:MySQL 默认返回 DOUBLE,PostgreSQL 返回 numeric,SQL Server 可能截断小数。不显式处理的话,前端展示或后续计算容易出偏差。
- 用
ROUND(AVG(salary), 2)统一控制小数位(所有主流数据库都支持) -
PostgreSQL中AVG()对整数列返回高精度numeric,但SUM()还是整型,相除时别漏掉类型转换 - 如果字段是
DECIMAL(10,2),AVG()结果可能变成DECIMAL(14,4),别假设它和原字段精度一致
WHERE 和 HAVING 的位置影响结果完全不同
想筛出“平均工资超 1 万且总薪资超 50 万”的部门?必须分清过滤时机:WHERE 在分组前过滤行,HAVING 在分组后过滤组。写反了就查不到数据,或者结果明显偏少。
- 先用
WHERE status = 'active'排除非在职员工,再分组算均值和总和 - 再用
HAVING AVG(salary) > 10000 AND SUM(salary) > 500000筛选满足条件的部门 - 如果把
AVG()或SUM()放进WHERE,会报错:ERROR: column "salary" must appear in the GROUP BY clause or be used in an aggregate function
GROUP BY 字段缺失导致“only_full_group_by”报错
在 MySQL 5.7+ 严格模式下,如果 SELECT 列表里有非聚合字段(比如 name),但没出现在 GROUP BY 中,就会触发 ONLY_FULL_GROUP_BY 错误。这不是语法问题,是明确拒绝歧义。
- 错误写法:
SELECT name, AVG(salary), SUM(salary) FROM employees GROUP BY dept;(name没分组也没聚合) - 正确做法:要么去掉
name,要么加进GROUP BY,要么用MAX(name)这类聚合包裹 - 别依赖旧版 MySQL 的宽松行为,上线前务必在目标环境验证

















