3.3.4.8 Подсчет строк
Базы данных часто используются для получения ответа на вопросы типа:
``как часто данные определенного типа встречаются в таблице?'' Вам,
например, может понадобиться узнать общее количество животных, или то,
сколько животных имеется у каждого из владельцев, или провести
статистические исследования на базе хранящейся информации.
Процедура подсчета количества животных в сущности идентична подсчету
количества строк в таблице, так как на каждое животное приходится по одной
записи. Функция 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
для объединения всех
записей по каждому из владельцев. Без этой команды запрос выдал бы только
сообщение об ошибке:
mysql> SELECT owner, COUNT(owner) FROM pet;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
Команды 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 |
+---------+------+----------+
Add your own comment.