4.4.8数行

数据库经常被用来回答这个问题,某一类型的数据在表中出现的频率是多少?例如,您可能想知道您有多少只宠物,或者每个主人有多少只宠物,或者您可能想对您的动物执行各种普查操作。

计算动物的总数和有多少行宠物表吗?因为每只宠物都有一个记录。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_BYSQL模式已启用,提示错误:

    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行为和相关优化。