MySQL AVG() 函数使用指南

MySQL AVG() 函数计算并返回表达式的平均值。

AVG() 语法

这里是 MySQL AVG() 函数的语法:

AVG(expr)
AVG(DISTINCT expr)

我们通常在 SQL 中按如下方式使用 AVG() 函数:

SELECT AVG(expr), ...
FROM table_name
[WHERE ...];

或者按如下方式结合 GROUP BY 子句使用 AVG() 函数:

SELECT AVG(expr), group_expr1, group_expr2, ...
FROM table_name
[WHERE ...]
GROUP BY group_expr1, group_expr2, ...;

参数

expr
expr 一个用于聚合运算的表达式。它可以是一个列名,也可以是一个表达式。
group_expr1, group_expr2, ...
用于分组的表达式或者列名。

返回值

AVG(expr) 函数返回表达式的平均值。 AVG(DISTINCT expr) 函数返回 expr 中唯一值的平均值。

  • AVG() 函数会忽略 NULL 值。
  • 如果没有匹配的行,AVG() 函数返回 NULL

AVG() 示例

我们将通过 student_score 表进行演示。让我们先创建演示表插入测试数据。

CREATE TABLE `student_score` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(255) NOT NULL,
    `subject` VARCHAR(255) NOT NULL,
    `score` INT NOT NULL
);
INSERT INTO `student_score` (`name`, `subject`, `score`)
VALUES ('Tom', 'Math', 80),
    ('Tom', 'English', 90),
    ('Jim', 'Math', 84),
    ('Jim', 'English', 96),
    ('Tim', 'Math', 80),
    ('Tim', 'English', 98);

以下是表中的数据:

+----+------+---------+-------+
| id | name | subject | score |
+----+------+---------+-------+
|  1 | Tom  | Math    |    80 |
|  2 | Tom  | English |    90 |
|  3 | Jim  | Math    |    84 |
|  4 | Jim  | English |    96 |
|  5 | Tim  | Math    |    80 |
|  6 | Tim  | English |    98 |
+----+------+---------+-------+

AVG() 简单例子

以下 SQL 语句返回所有成绩的平均成绩。

SELECT AVG(score) from student_score;
+------------+
| AVG(score) |
+------------+
|    88.0000 |
+------------+

AVG() 结合 GROUP BY

让我们使用 AVG() 结合 GROUP BY 来从更多的维度计算平均成绩。

  1. 按照科目计算平均成绩

    SELECT subject, AVG(score)
    FROM student_score
    GROUP BY subject;
    
    +---------+------------+
    | subject | AVG(score) |
    +---------+------------+
    | Math    |    81.3333 |
    | English |    94.6667 |
    +---------+------------+

    这里,MySQL 会根据 GROUP BY subject 首先按照 subject 将结果集分组,然后在每个组内再执行 AVG(score)

  2. 按照人计算平均成绩

    SELECT name, AVG(score)
    FROM student_score
    GROUP BY name;
    
    +------+------------+
    | name | AVG(score) |
    +------+------------+
    | Tom  |    85.0000 |
    | Jim  |    90.0000 |
    | Tim  |    89.0000 |
    +------+------------+

    这里,MySQL 会根据 GROUP BY name 首先按照 name 将结果集分组,然后在每个组内再执行 AVG(score)

AVG() 结合子查询

如果我们想要查询成绩在平均线以上的行,我们可以使用以下 SQL 语句:

SELECT *
FROM student_score
WHERE score > (
        SELECT AVG(score)
        FROM student_score
    );
+----+------+---------+-------+
| id | name | subject | score |
+----+------+---------+-------+
|  2 | Tom  | English |    90 |
|  4 | Jim  | English |    96 |
|  6 | Tim  | English |    98 |
+----+------+---------+-------+

注意,我们这里通过以下子查询语句查询出平均成绩:

SELECT AVG(score)
FROM student_score