在本教程中,我们将演示如何使用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
将使用示例数据库中的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
函数计算集合的平均值。