Spec-Zone.ru › MySQL 5.7

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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/counting-rows.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API