AVG
AVG() 算平均值——总和除以个数。AVG(列名) 只对非 NULL 值求平均,NULL 行被忽略。这意味着如果某列有 10 行,其中 2 行是 NULL,AVG 只对剩下的 8 行求平均。
这个行为有时符合预期("有奖金的人平均奖金多少"),有时需要额外处理("所有人平均奖金,没奖金的按 0 算")。两种算法得出的数字完全不同,选哪个取决于业务口径。AVG 返回的是数值类型,可能有小数——如果列是整数类型,AVG 的结果会自动转为小数,不用担心精度丢失。
以飞翔科技为例:
-- 全公司平均基本工资
SELECT AVG(basic_salary) AS 平均工资 FROM employees;
-- 技术部平均工资
SELECT AVG(basic_salary) AS 技术部均薪
FROM employees
WHERE dept_code = 2;
-- 有绩效奖金的员工平均奖金(NULL 不计入)
SELECT AVG(performance_bonus) AS 平均奖金
FROM employees
WHERE performance_bonus IS NOT NULL;
-- 所有人平均奖金(没奖金的按 0 算)
SELECT AVG(IFNULL(performance_bonus, 0)) AS 全员平均奖金
FROM employees;
最后两个例子对比了 AVG 对 NULL 的两种处理方式——分母不同,结果自然不同。