SQL 计算平均值,你想计算某一列的平均值,可能针对表中的全部记录,也可能只针对部分记录。例如,你希望知道全部员工的平均工资,同时也想知道每个部门的平均工资。
SQL 计算平均值 问题描述
你想计算某一列的平均值,可能针对表中的全部记录,也可能只针对部分记录。例如,你希望知道全部员工的平均工资,同时也想知道每个部门的平均工资。
SQL 计算平均值 解决方案
为了计算所有员工的平均工资,只需要针对 SAL
列调用 AVG
函数即可。由于没有使用 WHERE
子句,因此 AVG
函数会计算所有非 Null
值的平均值。
1 select avg(sal) as avg_sal
2 from emp
AVG_SAL
----------
2073.21429
为了计算每个部门的平均工资,需要使用 GROUP BY
子句来对部门进行分组。
1 select deptno, avg(sal) as avg_sal
2 from emp
3 group by deptno
DEPTNO AVG_SAL
---------- ----------
10 2916.66667
20 2175
30 1566.66667
SQL 计算平均值 扩展知识
针对整个表计算平均值时,只要对感兴趣的列执行 AVG
函数即可,而且不需要使用 GROUP BY
子句。请记住,AVG
函数会忽略 Null
。下面的例子演示了 Null
被忽略之后的结果。
create table t2(sal integer)
insert into t2 values (10)
insert into t2 values (20)
insert into t2 values (null)
select avg(sal) select distinct 30/2
from t2 from t2
AVG(SAL) 30/2
---------- ----------
15 15
select avg(coalesce(sal,0)) select distinct 30/3
from t2 from t2
AVG(COALESCE(SAL,0)) 30/3
-------------------- ----------
10 10
COALESCE
函数会返回其参数列表中的第一个非 Null
值。如果是 Null
,则 SAL
的值为 0
,这样平均值的计算结果也会发生变化。当使用聚合函数的时候,一定要先想一下如何处理 Null
。
本解决方案的第二部分使用 GROUP BY
(第 3 行)依据部门从属关系把员工数据分为若干组。GROUP BY
使得像 AVG
这样的聚合函数自动为每一个分组返回一个结果。本例中,AVG
函数将针对按照部门分组后的每一组员工数据进行计算。
顺便说一下,不一定非要把 GROUP BY
列放到 SELECT
列表里。来看下面这个例子。
select avg(sal)
from emp
group by deptno
AVG(SAL)
----------
2916.66667
2175
1566.66667
尽管 DEPTNO
没有被放在 SELECT
子句里,但是我们仍然按照该列分组。把用于分组的列放入 SELECT
子句通常有助于提高可读性,但这并不是必需的。反之则不然,不能把 GROUP BY
子句里没有的列放入 SELECT
列表。