SQL 计算平均值

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 列表。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程