5.3.4.8 Подсчёт строк
Базы данных часто используются для ответа на вопрос “Как часто встречается определённый тип данных в таблице?” Например, вы можете узнать, сколько у вас домашних животных, или сколько домашних животных у каждого владельца, или выполнить различные виды переписи населения ваших животных.
Подсчёт общего числа животных — это тот же вопрос, что и “Сколько строк в таблице pet?”, потому что на каждое животное приходится одна запись. COUNT(*) подсчитывает количество строк, поэтому запрос для подсчёта ваших животных выглядит так:
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 полезно для характеристики данных в различных группах. Следующие примеры демонстрируют различные способы выполнения операций переписи животных.
Количество животных по видам:
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 указывает, что пол неизвестен.)
Количество животных по комбинации вида и пола:
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(). Например, предыдущий запрос, выполненный только для собак и кошек, выглядит так:
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 |
+---------+------+----------+
Или, если вы хотели количество животных по полу только для животных, пол которых известен:
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, который назначает те же самые столбцы. В противном случае происходит следующее:
-
Если режим SQL
ONLY_FULL_GROUP_BYвключён, возникает ошибка: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 | +--------+----------+ 1 row in set (0.00 sec)
См. также Раздел 14.19.3, «Обработка GROUP BY в MySQL». См. Раздел 14.19.1, «Описание агрегатных функций» для получения информации о поведении COUNT( и связанных оптимизациях.expr)
© 2025 Oracle
Licensed under the GPLv2 License.