相关的文档10bet官方网站 本手册下载 本手册摘录

3.3.4.8数行

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

计算你拥有的动物的总数和有多少行宠物表吗?因为每只宠物有一个记录。COUNT (*)计数行数,所以查询计数你的动物看起来像这样:

mysql> SELECT COUNT(*) FROM pet;+----------+ | 数 (*) | +----------+ | 9  | +----------+

之前,你检索了养宠物的人的名字。您可以使用COUNT ()如果你想知道每个主人有多少只宠物:

mysql> 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 = '狗' OR species = '猫' GROUP BY species, sex;+---------+------+----------+ | 物种性| |计数 (*) | +---------+------+----------+ | 猫猫| f | 1 | | | m | 1 | | |狗f | 1 | | | |米狗2  | +---------+------+----------+

或者,如果你想知道每一性别动物的数量,只对已知性别的动物:

mysql> SELECT species, sex, COUNT(*) FROM pet WHERE sex IS NOT NULL+---------+------+----------+ | 物种性| |计数 (*) | +---------+------+----------+ | 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';mysql> SELECT owner, COUNT(*) FROM pet;ERROR 1140(42000):在聚合查询没有GROUP BY, SELECT列表的表达式#1包含非聚合列' menagery .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)行为和相关优化。