如果你有试过算考试的平均分,或者比如说算部门的平均工资,那你其实已经懂了平均数的概念。其实这个东西在学校经常学。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 = 3 和 id = 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() 会报错。
GO TO FULL VERSION