Принципы группировки
155
> GROUP BY open_emp_id;
+++
| open_emp_id | how_many |
+++
| 1 | 8 |
| 10 | 7 |
| 13 | 3 |
| 16 | 6 |
+++
4 rows in set (0.00 sec)
Агрегатная функция
count()
подсчитывает
количество строк в каждой
группе, а звездочка предписывает серверу сосчитать все строки в груп
пе. Сочетание блока
group
by
и
функции обобщения
count()
позволяет
формировать именно те данные, которые требуются для ответа на при
кладной вопрос, без необходимости
просматривать необработанные
данные.
При группировке может понадобиться отфильтровать из результирую
щего набора ненужные данные, опираясь на
информацию групп дан
ных, а не необработанных данных. Блок
group
by
выполняется
после
вычисления блока
where
, поэтому условия фильтрации нельзя добав
лять в
блок
where
. Вот, например, попытка отфильтровать всех сотруд
ников, открывших меньше пяти счетов:
mysql>
SELECT open_emp_id, COUNT(*) how_many
> FROM account
> WHERE COUNT(*) > 4
> GROUP BY open_emp_id, product_cd;
ERROR 1111 (HY000): Invalid use
of group function
Агрегатную функцию
count(*)
нельзя использовать в блоке
where
, по
тому что на
момент вычисления блока
where
группы еще не сформиро
ваны. Вместо этого можно поместить условия фильтрации группы
в блок
having
. Вот пример
того же запроса с блоком
having
:
mysql>
SELECT open_emp_id, COUNT(*) how_many
> FROM account
> GROUP BY open_emp_id
Достарыңызбен бөлісу: