MySQL COUNT() 函数使用指南

MySQL COUNT() 函数用于统计表达式代表的所有值的中的非 NULL 值的数量。

COUNT() 语法

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

COUNT(expr)

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

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

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

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

参数

expr
expr 一个需要统计数量的表达式。它可以是一个列名,也可以是一个表达式。
group_expr1, group_expr2, ...
用于分组的表达式或者列名。

返回值

COUNT(expr) 函数返回 SELECT 语句返回的所有行中的表达式代表的所有值的中的非 NULL 值的数量。

注意: 如果您使用 COUNT(*) 或者类似于 COUNT(1) 之类的语句,则会统计 NULL 值。

COUNT() 示例

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

DROP TABLE IF EXISTS `student_score`;
CREATE TABLE `student_score` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(255) NOT NULL,
    `subject` VARCHAR(255) NOT NULL,
    `score` INT
);
INSERT INTO `student_score` (`name`, `subject`, `score`)
VALUES ('Tom', 'Math', 80),
    ('Tom', 'English', 90),
    ('Jim', 'Math', 84),
    ('Jim', 'English', 96),
    ('Tim', 'Math', NULL),
    ('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    |  NULL |
|  6 | Tim  | English |    98 |
+----+------+---------+-------+

COUNT() 简单例子

以下 SQL 语句返回 student_score 表中的所有行数。

SELECT COUNT(id) from student_score;
+-----------+
| COUNT(id) |
+-----------+
|         6 |
+-----------+

让我们再看一下 student_score 表中的所有分数的数量。

SELECT COUNT(score) from student_score;
+--------------+
| COUNT(score) |
+--------------+
|            5 |
+--------------+

这里,由于 score 列中有一个 NULL 值,因此 COUNT(score) 的结果为 5.

COUNT() 结合 GROUP BY

让我们使用 COUNT() 结合 GROUP BY 来从更多的维度统计数量。

  1. 按科目统计成绩的数量

    SELECT subject, COUNT(score)
    FROM student_score
    GROUP BY subject;
    
    +---------+-----------+
    | subject | COUNT(id) |
    +---------+-----------+
    | Math    |         2 |
    | English |         3 |
    +---------+-----------+

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

  2. 按名称统计成绩的数量

    SELECT name, COUNT(score)
    FROM student_score
    GROUP BY name;
    
    +------+--------------+
    | name | COUNT(score) |
    +------+--------------+
    | Tom  |            2 |
    | Jim  |            2 |
    | Tim  |            1 |
    +------+--------------+

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

    由于 Tim 的数学分数为 NULL,因此 Tim 的 COUNT(score) 的结果为 1