3.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)
См. также Раздел 12.19.3, «Обработка GROUP BY в MySQL». См. Раздел 12.19.1, «Описание агрегатных функций» для получения информации о поведении COUNT( и связанных оптимизациях.expr)
© 2025 Oracle
Licensed under the GPLv2 License.