Базы данных часто используются для получения ответа на вопросы типа: ``как часто данные определенного типа встречаются в таблице?'' Вам, например, может понадобиться узнать общее количество животных, или то, сколько животных имеется у каждого из владельцев, или провести статистические исследования на базе хранящейся информации.
Процедура подсчета количества животных в сущности идентична подсчету
количества строк в таблице, так как на каждое животное приходится по одной
записи. Функция 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 | +---------+------+----------+
User Comments
The GROUP BY clause yields different result between MySQL 4.0.17 and Oracle 8i (didn't check SQL Server).
3 rows in set (0.00 sec)Given a table "items":
mysql> select * from items;
Using the following SELECT statement:
SELECT name, sum(cost) FROM items BROUP BY owner;
Oracle will detect an error saying not a GROUP BY expression
but MySQL gives a result:
2 rows in set (0.01 sec)
Oracle seems to be correct since the "name" column could not really be GROUP BY "owner".
Any comment...
The same for 5.0.0 alpha. To me, it seems a bug, not a feature. Have you reported it?
clear deviation from standards.
but it is documented
http://www.mysql.com/doc/en/GROUP-BY-hidden-fields.html
so it is not a bug - this is a non-standard feature
it seems to take the first record from the underlying set
i.e. likes like "FIRST" function in ms-access
Add your own comment.