MySQL 8.4 Release Notes
5.3.4.8 计算行数
数据库通常用于回答问题,例如“某种数据类型在表中出现的频率?”例如,你可能想知道你有多少只宠物,或者每个主人有多少只宠物,或者你想对动物进行各种人口普查操作。
计算总共有多少只宠物是问“pet 表中有多少行?”的同一个问题,因为每只宠物都有一条记录。COUNT(*)
计算了行数,所以统计宠物数量的查询语句如下:
Press CTRL+C to copymysql> SELECT COUNT(*) FROM pet; +----------+ | COUNT(*) | +----------+ | 9 | +----------+
之前,你已经获取了拥有宠物的人名。你可以使用COUNT()
如果你想知道每个主人有多少只宠物:
Press CTRL+C to copymysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 | +--------+----------+
前面的查询使用 GROUP BY
将所有记录分组到每个 owner
。使用COUNT()
和 GROUP BY
是对数据进行各种分组的有用方法。以下示例展示了不同方式的动物普查操作。
每种宠物的数量:
Press CTRL+C to copymysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+ | species | COUNT(*) | +---------+----------+ | bird | 2 | | cat | 2 | | dog | 3 | | hamster | 1 | | snake | 1 | +---------+----------+
每种性别的数量:
Press CTRL+C to copymysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | NULL | 1 | | f | 4 | | m | 4 | +------+----------+
(在这个输出中,NULL
表示性别未知。)
每种宠物和性别的组合数量:
Press CTRL+C to copymysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
您不需要在使用COUNT()
时检索整个表。例如,之前的查询,在只对狗和猫进行时,类似这样:
Press CTRL+C to copymysql> SELECT species, sex, COUNT(*) FROM pet WHERE species = 'dog' OR species = 'cat' GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | +---------+------+----------+
或者,如果你想要知道每种性别动物的数量,只对已知性别的动物:
Press CTRL+C to copymysql> SELECT species, sex, COUNT(*) FROM pet WHERE sex IS NOT NULL GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
如果你在选择COUNT()
值外还要选择列名,那么就需要使用GROUP BY
子句,列名与之相同。否则,以下情况发生:
-
如果启用
ONLY_FULL_GROUP_BY
SQL 模式,出现错误:Press CTRL+C to copymysql> SET sql_mode = 'ONLY_FULL_GROUP_BY'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT owner, COUNT(*) FROM pet; ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'menagerie.pet.owner'; this is incompatible with sql_mode=only_full_group_by
-
如果不启用
ONLY_FULL_GROUP_BY
,查询将被处理为对所有行进行组合,但每个命名列的值是非确定性的服务器可以从任何行中选择:Press CTRL+C to copymysql> SET sql_mode = ''; Query OK, 0 rows affected (0.00 sec) mysql> SELECT owner, COUNT(*) FROM pet; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Harold | 8 | +--------+----------+ 1 row in set (0.00 sec)
请参见第14.19.3节,“MySQL 处理 GROUP BY”。关于COUNT(
行为和相关优化的信息,请参见第14.19.1节,“聚合函数描述”。expr
)