MySQL 8.0版本说明
MySQL 8.0源代码文档10bet官方网站
数据库经常被用来回答这个问题,”某种类型的数据在表中出现的频率是多少?”例如,您可能想知道您有多少只宠物,或者每个主人有多少只宠物,或者您可能想对您的动物执行各种普查操作。
计算你所拥有的动物的总数是同样的问题”有多少行宠物
表吗?”因为每个宠物都有一条记录。COUNT (*)
计算行数,因此计算动物数量的查询如下所示:
SELECT COUNT(*) FROM pet;+----------+ | 数 (*) | +----------+ | 9 | +----------+
前面,您检索了拥有宠物的人的姓名。你可以使用COUNT ()
如果你想知道每个主人有多少宠物:
SELECT owner, COUNT(*) FROM pet GROUP BY owner+--------+----------+ | 主人|计数 (*) | +--------+----------+ | 戴安Benny | 2 | | | 2 | |格温| 3 | |哈罗德| 2 | +--------+----------+
上面的查询使用集团
对每个记录进行分组老板
.使用COUNT ()
连同集团
对于在各种分组下描述数据非常有用。下面的例子展示了执行动物普查操作的不同方法。
每种动物数量:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species+---------+----------+ | 物种|计数 (*) | +---------+----------+ | 猫鸟| 2 | | | 2 | |狗| 3 | |仓鼠| 1 | | 1 |的蛇 | +---------+----------+
每性别的动物数量:
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex+------+----------+ | 性|计数 (*) | +------+----------+ | f零| 1 | | | 4 | | | 4 | +------+----------+
(在此输出中,零
表示性别未知。)
每种物种和性别组合的动物数量:
mysql> 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 = 'dog' OR species = 'cat' GROUP BY species, sex;+---------+------+----------+ | 物种性| |计数 (*) | +---------+------+----------+ | 猫猫| f | 1 | | | m | 1 | | |狗f | 1 | | | |米狗2 | +---------+------+----------+
或者,如果你只想知道性别已知的动物的性别数量:
mysql> SELECT species, sex, COUNT(*) FROM pet WHERE sex 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';mysql> SELECT owner, COUNT(*) FROM pet错误1140(42000):在没有GROUP BY的聚合查询中,SELECT列表的表达式#1包含非聚合列' zoo .pet.owner';这与sql_mode=only_full_group_by不兼容
如果
ONLY_FULL_GROUP_BY
未启用时,将通过将所有行视为单个组来处理查询,但为每个命名列选择的值是不确定的。服务器可以从任意行中选择值:mysql> SET sql_mode = ";mysql> SELECT owner, COUNT(*) FROM pet+--------+----------+ | 主人|计数 (*) | +--------+----------+ | 哈罗德| 8 | +--------+----------+ 1行集(0.00秒)
另请参阅第12.20.3节,“MySQL处理GROUP BY”.看到第12.20.1节,“聚合功能描述”有关计数(
行为和相关的优化。expr
)