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