MySQL™ 参考手册(计数行)

计数行

数据库一般用于回答“表中某种类型的数据出现频率多少?”的问题。例如,你可能想知道你拥有多少只宠物,或每一个拥有者拥有多少只宠物,或者你可能想要对你的动物进行各类类型的普查操做。mysql

计算你拥有的动物总数与“pet表中有多少行?”的问题相同。由于每只宠物有一条记录,COUNT(*)计算行数,所以计算动物的查询以下所示:sql

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

以前,你检索了拥有宠物的人的姓名,若是你想知道每一个拥有者有多少宠物,你可使用COUNT()数据库

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+--------+----------+

上述查询使用GROUP BY对每一个owner的全部记录进行分组,将COUNT()GROUP BY结合使用在各类分组下描述你的数据很是有用,如下示例显示了执行动物普查操做的不一样方法。express

每种动物数量:segmentfault

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird    |        2 |
| cat     |        2 |
| dog     |        3 |
| hamster |        1 |
| snake   |        1 |
+---------+----------+

每种性别的动物数量:服务器

mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex  | COUNT(*) |
+------+----------+
| NULL |        1 |
| f    |        4 |
| m    |        4 |
+------+----------+

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

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

mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | NULL |        1 |
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

使用COUNT()时无需检索整个表,例如,以前的查询,只在狗和猫上执行时,以下所示:ci

mysql> SELECT species, sex, COUNT(*) FROM pet
       WHERE species = 'dog' OR species = 'cat'
       GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
+---------+------+----------+

或者,若是你想要每种性别的动物数量仅适用于已知性别的动物:get

mysql> SELECT species, sex, COUNT(*) FROM pet
       WHERE sex IS NOT NULL
       GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

若是在COUNT()值以外指定要选择的列的名称,应该存在一个GROUP BY子句来命名那些相同的列,不然,会发生如下状况:

  • 若是启用了ONLY_FULL_GROUP_BY 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
  • 若是未启用ONLY_FULL_GROUP_BY,则经过将全部行视为单个组来处理查询,但为每一个命名列选择的值是不肯定的,服务器能够自由选择任何行中的值:

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT owner, COUNT(*) FROM pet;
    +--------+----------+
    | owner  | COUNT(*) |
    +--------+----------+
    | Harold |        8 |
    +--------+----------+

上一篇:模式匹配

相关文章
相关标签/搜索