数据库通常用于回答以下问题:“某种类型的数据在表中出现的频率如何?”例如,您可能想知道您有多少只宠物,或者每个主人有多少只宠物,或者您可能想对您的动物执行各种类型的普查操作。

计算您拥有的动物总数与“宠物表中有多少行?”是同一个问题。因为每只宠物有一个记录。 COUNT(*) 计算行数,因此计算动物数量的查询如下所示:

  1. mysql> SELECT COUNT(*) FROM pet;
  2. +----------+
  3. | COUNT(*) |
  4. +----------+
  5. | 9 |
  6. +----------+

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

  1. mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
  2. +--------+----------+
  3. | owner | COUNT(*) |
  4. +--------+----------+
  5. | Benny | 2 |
  6. | Diane | 2 |
  7. | Gwen | 3 |
  8. | Harold | 2 |
  9. +--------+----------+

前面的查询使用 GROUP BY 对每个所有者的所有记录进行分组。将 COUNT() 与 GROUP BY 结合使用对于在各种分组下表征您的数据很有用。以下示例显示了执行动物普查操作的不同方法。

每个物种的动物数量:

  1. mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
  2. +---------+----------+
  3. | species | COUNT(*) |
  4. +---------+----------+
  5. | bird | 2 |
  6. | cat | 2 |
  7. | dog | 3 |
  8. | hamster | 1 |
  9. | snake | 1 |
  10. +---------+----------+

每种性别的动物数量:

  1. mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
  2. +------+----------+
  3. | sex | COUNT(*) |
  4. +------+----------+
  5. | NULL | 1 |
  6. | f | 4 |
  7. | m | 4 |
  8. +------+----------+

(在此输出中,NULL 表示性别未知。)

每个物种和性别组合的动物数量:

  1. mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
  2. +---------+------+----------+
  3. | species | sex | COUNT(*) |
  4. +---------+------+----------+
  5. | bird | NULL | 1 |
  6. | bird | f | 1 |
  7. | cat | f | 1 |
  8. | cat | m | 1 |
  9. | dog | f | 1 |
  10. | dog | m | 2 |
  11. | hamster | f | 1 |
  12. | snake | m | 1 |
  13. +---------+------+----------+

使用 COUNT() 时不需要检索整个表。例如,上一个查询,当只对狗和猫执行时,看起来像这样:

  1. mysql> SELECT species, sex, COUNT(*) FROM pet
  2. WHERE species = 'dog' OR species = 'cat'
  3. GROUP BY species, sex;
  4. +---------+------+----------+
  5. | species | sex | COUNT(*) |
  6. +---------+------+----------+
  7. | cat | f | 1 |
  8. | cat | m | 1 |
  9. | dog | f | 1 |
  10. | dog | m | 2 |
  11. +---------+------+----------+

或者,如果您只想要已知性别的动物的每种性别的动物数量:

  1. mysql> SELECT species, sex, COUNT(*) FROM pet
  2. WHERE sex IS NOT NULL
  3. GROUP BY species, sex;
  4. +---------+------+----------+
  5. | species | sex | COUNT(*) |
  6. +---------+------+----------+
  7. | bird | f | 1 |
  8. | cat | f | 1 |
  9. | cat | m | 1 |
  10. | dog | f | 1 |
  11. | dog | m | 2 |
  12. | hamster | f | 1 |
  13. | snake | m | 1 |
  14. +---------+------+----------+

如果除了 COUNT() 值之外还命名要选择的列,则应该存在一个 GROUP BY 子句来命名这些相同的列。否则,会出现以下情况:

  • 如果启用了 ONLY_FULL_GROUP_BY SQL 模式,则会出现错误: ```sql mysql> 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

  1. - 如果未启用 ONLY_FULL_GROUP_BY,则通过将所有行视为一个组来处理查询,但为每个命名列选择的值是不确定的。服务器可以自由地从任何行中选择值:
  2. ```sql
  3. mysql> SET sql_mode = '';
  4. Query OK, 0 rows affected (0.00 sec)
  5. mysql> SELECT owner, COUNT(*) FROM pet;
  6. +--------+----------+
  7. | owner | COUNT(*) |
  8. +--------+----------+
  9. | Harold | 8 |
  10. +--------+----------+
  11. 1 row in set (0.00 sec)