Spec-Zone .ru
спецификации, руководства, описания, API
|
Базы данных часто используются, чтобы ответить на вопрос, "Как часто определенный тип данных происходит в таблице?" Например, Вы могли бы хотеть знать, сколько домашних животных Вы имеете, или сколько домашних животных каждый владелец имеет, или Вы могли бы хотеть выполнить различные виды операций переписи на Ваших животных.
Подсчет общего количества животных, которых Вы имеете, является тем же самым вопросом как, "Сколько строк находится в 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()
значение, a GROUP BY
пункт должен
присутствовать, который называет те те же самые столбцы. Иначе, следующее происходит:
Если ONLY_FULL_GROUP_BY
Режим SQL включается, ошибка происходит:
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): Mixing of GROUP columns (MIN(),MAX(),COUNT()...)with no GROUP columns is illegal if there is no GROUP BY clause
Если 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)