CodeGym /课程 /SQL SELF /AVG() 计算平均值 — 按列求平均

AVG() 计算平均值 — 按列求平均

SQL SELF
第 7 级 , 课程 3
可用

如果你有试过算考试的平均分,或者比如说算部门的平均工资,那你其实已经懂了平均数的概念。其实这个东西在学校经常学。SQL 里,只要你想在数据集里算平均值,直接用 AVG() 就行了。

AVG() 这个函数是聚合函数,用来算数字列的平均数。它会把指定列里的所有值加起来,然后除以这些值的数量。它会自动忽略 NULL(其实这样反而更方便,后面会讲)。

AVG() 的语法

先来看看最基础的语法:

SELECT AVG(列名)
FROM 表名;

注意:这里的 列名 就是你想算平均值的数字列。

例子1:员工的平均工资

假设我们有一张 employees 表,里面存着员工和他们的工资:

id name salary
1 Otto 50000
2 Maria 60000
3 Alex 55000
4 Anna NULL
5 Dan 52000

算平均工资的简单 SQL:

SELECT AVG(salary) AS average_salary
FROM employees;

结果:

average_salary
54250

怎么回事?

  • AVG() 把所有工资加起来:50000 + 60000 + 55000 + 52000 = 217000。
  • 然后除以非空(不是 NULL)的数量:217000 / 4 = 54250。

AVG() 处理 NULL 的特点

你可能注意到了,算平均工资的时候,salary 里的 NULL 被忽略了。这就是 AVG() 的一个关键点。它只算不是 NULL 的值。

来个例子:

SELECT AVG(NULL) AS result;

结果:

result
NULL

这又说明了 AVG() 会忽略 NULL。不过,如果全是 NULL,那结果就是 NULL

但如果表里不是 NULL,而是 0,这个 0 是不会被忽略的。

employees

id salary
1 1000
2 0
3 NULL
4 2000

SQL 查询:

SELECT AVG(salary) AS avg_salary
FROM employees;

结果:

avg_salary
1000

为啥这样?

因为 AVG() 算的是:

[(1000 + 0 + 2000) / 3 = 1000]

NULL 的那行直接不算。

例子:算学生的平均年龄

现在看下 students 表:

id name age
1 Anna 20
2 Max 22
3 Maria NULL
4 Otto 21

SQL:

SELECT AVG(age) AS average_age
FROM students;

结果:

average_age
21
  • AVG() 会忽略 Maria,因为她的年龄是 NULL
  • 平均值是:(20 + 22 + 21) / 3 = 21。

结果四舍五入

有时候 AVG() 的结果会带很多小数位。

如果你想要个四舍五入的数字,可以用 ROUND()

employees

id salary
1 50000
2 60000
3 47000
4 NULL

SQL 查询

SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;

结果

rounded_average_salary
52333.33

NULL 的那行被排除了,所以平均是按三个值算的。

AVG() 前先过滤数据

如果你只想算符合某些条件的平均值,可以用 WHERE

employees

id salary
1 50000
2 60000
3 47000
4 60000
5 NULL

例子:找出 id > 2 的员工平均工资。

SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;

结果

average_salary
53500

只有 id = 3id = 4 的工资参与计算,NULL 那行被排除了。

例子:复杂查询和 AVG()

你可以把 AVG() 和其他聚合函数、操作符一起用。

比如我们有个销售表 sales

sale_id product quantity price
1 手机 2 500
2 笔记本 1 1500
3 平板 3 300

算平均总销售额的 SQL:

SELECT AVG(quantity * price) AS average_total_sale
FROM sales;

结果:

averagetotalsale
950

实用技巧和常见坑

AVG() 的时候要注意这些常见问题:

NULL 值:有时候你会发现结果比你想的要小。记住 AVG() 会跳过 NULL 的行。

数据类型混用:如果一列里有数字也有文本(其实这样很糟糕),AVG() 会报错。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION