SQL AVG函数

简介: SQL AVG函数

SQL AVG函数

SQL AVG函数简介

SQL AVG函数是一个聚合函数,用于计算集合的平均值。 以下说明了SQL AVG函数的语法:

AVG([ALL|DISTINCT] expression)

如果使用ALL关键字,AVG函数将获取计算中的所有值。 默认情况下,无论是否指定,AVG函数都使用ALL。

如果明确指定DISTINCT关键字,AVG函数将仅在计算中采用唯一值。例如,有一组数据集(1,2,3,3,4)并将AVG(ALL)应用于此集合,AVG函数将执行以下计算:

(1+2+3+3+4)/5 = 2.6

但是,如果指定:AVG(DISTINCT)将按如下方式处理:

(1+2+3+4)/4 = 2.5

SQL AVG函数示例

将使用示例数据库中的employees表来演示SQL AVG函数的工作原理。 以下图片说明了employees表的结构:

mysql> desc employees;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| employee_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
| first_name    | varchar(20)  | YES  |     | NULL    |                |
| last_name     | varchar(25)  | NO   |     | NULL    |                |
| email         | varchar(100) | NO   |     | NULL    |                |
| phone_number  | varchar(20)  | YES  |     | NULL    |                |
| hire_date     | date         | NO   |     | NULL    |                |
| job_id        | int(11)      | NO   | MUL | NULL    |                |
| salary        | decimal(8,2) | NO   |     | NULL    |                |
| manager_id    | int(11)      | YES  | MUL | NULL    |                |
| department_id | int(11)      | YES  | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
10 rows in set

要计算所有员工的平均工资,请将AVG函数应用于salary列,如下所示:

SELECT 
    AVG(salary)
FROM
    employees;

执行上面示例代码,得到以下结果:

+-------------+
| AVG(salary) |
+-------------+
| 8060        |
+-------------+
1 row in set

应用DISTINCT运算符来查看结果是否发生了变化:

SELECT 
    AVG(DISTINCT salary)
FROM
    employees;

执行上面示例代码,得到以下结果:

+----------------------+
| AVG(DISTINCT salary) |
+----------------------+
| 7845.454545          |
+----------------------+
1 row in set

如上结果有改变,因为一些员工有相同的薪水。要将结果舍入为2位小数,请使用ROUND函数,如下所示:

SELECT 
    ROUND(AVG(DISTINCT salary), 2)
FROM
    employees;

要计算值子集的平均值,在SELECT语句中添加WHERE子句。 例如,要计算部门ID为5中员工的平均工资,使用以下查询:

SELECT
    AVG(DISTINCT salary)
FROM
    employees
WHERE
    department_id = 5;

以下语句返回工作岗位ID为6的员工的平均工资:

SELECT 
    AVG(salary)
FROM
    employees
WHERE
    job_id = 6;

执行上面示例代码,得到以下结果:

+-------------+
| AVG(salary) |
+-------------+
| 7920        |
+-------------+
1 row in set

带有GROUP BY子句的SQL AVG示例
要计算组的平均值,将AVG函数与GROUP BY子句一起使用。 例如,以下语句返回各部门的员工和员工的平均工资。

SELECT
    department_id,
    AVG(salary)
FROM
    employees
GROUP BY
    department_id;

执行上面示例代码,得到以下结果:

在这里插入图片描述
可以使用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;

执行上面示例代码,得到以下结果:

在这里插入图片描述

带有ORDER BY子句的SQL AVG示例

要对包含AVG结果的结果集进行排序,请使用AVG函数与ORDER BY子句,如下所示:

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子句示例

要过滤分组,请AVG函数中使用HAVING子句。 例如,以下语句获取平均薪水小于5000的部门:

SELECT
    e.department_id,
    department_name,
    AVG(salary) AS avgsalary
FROM
    employees e
INNER JOIN departments d ON d.department_id = e.department_id
GROUP BY
    e.department_id
HAVING avgsalary<5000
ORDER BY
    AVG(salary) DESC;

执行上面查询语句,得到以下结果:

+---------------+-----------------+-----------+
| department_id | department_name | avgsalary |
+---------------+-----------------+-----------+
|             1 | 管理            | 4400      |
|             3 | 采购            | 4150      |
+---------------+-----------------+-----------+
2 rows in set

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;

查询语句的工作原理。

  • 子查询返回每个部门的一组员工平均工资。
  • 外部查询返回部门的平均工资。

在本教程中,您学习了如何使用SQL AVG函数计算集合的平均值。

相关文章
|
8天前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
11天前
|
SQL 数据处理 数据库
|
11天前
|
SQL Oracle 关系型数据库
SQL 中的大小写处理函数详解
【8月更文挑战第31天】
26 0
|
11天前
|
SQL 数据采集 数据挖掘
为什么要使用 SQL 函数?详尽分析
【8月更文挑战第31天】
10 0
|
11天前
|
SQL 存储 关系型数据库
COALESCE 函数:SQL中的空值处理利器
【8月更文挑战第31天】
51 0
|
11天前
|
SQL 关系型数据库 数据处理
|
11天前
|
SQL 数据挖掘
|
11天前
|
SQL Oracle 关系型数据库
NVL() 函数:SQL中的空值处理利器
【8月更文挑战第31天】
87 0
|
11天前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
70 0
|
17天前
|
SQL JavaScript 前端开发
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题