MySQL 8.0参考手册
MySQL 8.0版本说明
数据库经常被用来回答这个问题,”某一类型的数据在表中出现的频率是多少?”例如,您可能想知道您有多少只宠物,或者每个主人有多少只宠物,或者您可能想对您的动物执行各种普查操作。
计算动物的总数和”有多少行宠物
表吗?”因为每只宠物都有一个记录。COUNT (*)
计算行数,所以计算你的动物的查询看起来像这样:
SELECT COUNT(*) FROM pet;+----------+ | 数 (*) | +----------+ | 9 | +----------+
之前,你检索了那些养宠物的人的名字。您可以使用COUNT ()
如果你想知道每个主人有多少只宠物:
SELECT owner, COUNT(*) FROM pet GROUP BY owner;+--------+----------+ | 主人|计数 (*) | +--------+----------+ | 戴安Benny | 2 | | | 2 | |格温| 3 | |哈罗德| 2 | +--------+----------+
前面的查询使用集团
对每个对象的所有记录进行分组老板
.的使用COUNT ()
结合集团
用于在各种分组下描述数据。下面的例子展示了执行动物普查操作的不同方法。
每种动物数量:
SELECT (*) FROM pet GROUP BY species;+---------+----------+ | 物种|计数 (*) | +---------+----------+ | 猫鸟| 2 | | | 2 | |狗| 3 | |仓鼠| 1 | | 1 |的蛇 | +---------+----------+
每性别的动物数量:
SELECT sex, COUNT(*) FROM pet GROUP BY sex+------+----------+ | 性|计数 (*) | +------+----------+ | f零| 1 | | | 4 | | | 4 | +------+----------+
(在这个输出,零
表示性别不详。)
每种物种和性别组合的动物数量:
SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;+---------+------+----------+ | 物种性| |计数 (*) | +---------+------+----------+ | f鸟鸟零| 1 | | | | | 1 | | |猫f | 1 | | |猫m | 1 | | |狗f | 1 | | |狗m | 2 | |仓鼠| f | 1 | | |蛇m | 1 | +---------+------+----------+
使用时不需要检索整个表COUNT ()
.例如,前一个查询,当只在狗和猫上执行时,看起来像这样:
mysql> SELECT species, sex, COUNT(*) FROM pet WHERE species = '狗' OR species = '猫'+---------+------+----------+ | 物种性| |计数 (*) | +---------+------+----------+ | 猫猫| f | 1 | | | m | 1 | | |狗f | 1 | | | |米狗2 | +---------+------+----------+
或者,如果你想知道已知性别的动物的每种性别的数量:
mysql> SELECT FROM pet WHERE sex IS NOT NULL GROUP BY species, sex;+---------+------+----------+ | 物种性| |计数 (*) | +---------+------+----------+ | f猫鸟| f | 1 | | | | 1 | | |猫m | 1 | | |狗f | 1 | | |狗m | 2 | |仓鼠| f | 1 | | |蛇m | 1 | +---------+------+----------+
除。之外,如果为要选择的列命名COUNT ()
值,集团
子句应该为这些相同的列命名。否则,会发生以下情况:
如果
ONLY_FULL_GROUP_BY
SQL模式已启用,提示错误:mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY';SELECT owner, COUNT(*) FROM pet;错误1140(42000):在没有GROUP BY的聚合查询中,SELECT列表的表达式#1包含非聚合列'menagerie.pet.owner';这与sql_mode=only_full_group_by不兼容
如果
ONLY_FULL_GROUP_BY
如果未启用,则通过将所有行作为单个组处理查询,但为每个指定列选择的值是不确定的。服务器可以自由地从任意行选择值:设置sql_mode = ";SELECT owner, COUNT(*) FROM pet;+--------+----------+ | 主人|计数 (*) | +--------+----------+ | 哈罗德| 8 | +--------+----------+ 1行集(0.00秒)
另请参阅MySQL处理组BY.看到聚合函数描述和有关信息。计数(
行为和相关优化。expr
)