摘要:在本教程中,我们将向您展示如何使用 SQL AVG 函数获取一组数据的平均值。
SQL AVG 函数简介
SQL AVG 函数是一个计算一组数据的平均值的聚合函数。下面说明了 SQL AVG 函数的语法
AVG([ALL|DISTINCT] expression)
Code language: SQL (Structured Query Language) (sql)
如果我们使用 ALL 关键字,AVG 函数会将所有值纳入计算。即使我们未指定 ALL,AVG 函数默认情况下也会使用 ALL。
如果我们显式指定 DISTINCT 关键字,AVG 函数将仅在计算中使用唯一值。
例如,我们有一组 (1,2,3,3,4),并对此组应用 AVG(ALL),AVG 函数将执行以下计算
(1+2+3+3+4)/5 = 2.6
Code language: SQL (Structured Query Language) (sql)
然而,AVG(DISTINCT) 的处理过程如下
(1+2+3+4)/4 = 2.5
Code language: SQL (Structured Query Language) (sql)
SQL AVG 函数示例
我们将使用示例数据库中的 employees
表来演示 SQL AVG 函数的工作原理。下图展示了 employees
表的结构

若要计算所有员工的平均工资,请将 AVG 函数应用到 salary 列,如下所示
SELECT
AVG(salary)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

我们应用 DISTINCT 运算符来看看结果是否有变化
SELECT
AVG(DISTINCT salary)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

它发生了变化,因为一些员工的工资相同。
若要将结果四舍五入到小数点后两位,请使用 ROUND 函数,如下所示
SELECT
ROUND(AVG(DISTINCT salary), 2)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

若要计算一组值中的平均值,我们可以向 WHERE 子句 中添加一个 SELECT 语句。例如,若要计算部门 id 为 5 的员工的平均工资,我们使用以下查询
SELECT
AVG(DISTINCT salary)
FROM
employees
WHERE
department_id = 5;
Code language: SQL (Structured Query Language) (sql)

以下语句返回职务 id 为 6 的员工的平均工资
SELECT
AVG(salary)
FROM
employees
WHERE
job_id = 6;
Code language: SQL (Structured Query Language) (sql)

SQL AVG 与 GROUP BY 子句示例
若要计算组的平均值,我们使用 AVG 函数并带有 GROUP BY 子句。例如,以下语句返回各部门以及各个部门员工的平均工资。
SELECT
department_id,
AVG(salary)
FROM
employees
GROUP BY
department_id;
Code language: SQL (Structured Query Language) (sql)

我们可以使用 inner join 子句将 employees
表和 departments
表联接起来,以获取部门名称数据
SELECT
e.department_id,
department_name,
AVG(salary)
FROM
employees e
INNER JOIN departments d ON d.department_id = e.department_id
GROUP BY
e.department_id;
Code language: SQL (Structured Query Language) (sql)

SQL AVG 与 ORDER BY 子句示例
若要对包括 AVG 结果的结果集进行排序,请在 ORDER BY 子句中使用 AVG 函数,如下所示
SELECT e.department_id, department_name, AVG(salary) FROM employees e INNER JOIN departments d ON d.department_id = e.department_id GROUP BY e.department_id ORDER BY AVG(salary) DESC;

SQL AVG 与 HAVING 子句示例
若要过滤组,请在 HAVING 子句中使用 AVG 函数。例如,以下语句获取平均工资低于 5000 的部门

SQL AVG 与子查询
我们可以在一个 SQL 语句中多次应用 AVG 函数,以此来计算一系列平均值的平均值。
例如,我们可以使用 AVG 函数计算每个部门中员工的平均工资,然后再应用 AVG 函数一次来计算各部门的平均工资。
以下查询描述了这个想法
SELECT
AVG(employee_sal_avg)
FROM
(
SELECT
AVG(salary) employee_sal_avg
FROM
employees
GROUP BY
department_id
) t;
Code language: SQL (Structured Query Language) (sql)
查询的工作原理。
- 子查询返回一个为每个部门的员工平均工资的结果集。
- 外部查询返回各个部门的平均工资。
在本教程中,您学习了如何使用 SQL AVG 函数计算一组数据的平均值。