Выбор групп только с определенными характеристиками

Задача
Вы хотите вычислить итоги для групп, но результаты вывести только для групп, отвечающих определенным требованиям.

Решение
Используйте инструкцию HAVING.

Обсуждение
Вы уже умеете применять инструкцию WHERE для задания условий, которым должны удовлетворять отдельные записи, выбираемые запросом. Кажется естественным использовать WHERE и для написания условий для итоговых значений. Но ничего не выйдет. Если вы захотите узнать, какой водитель из таблицы driver_log работал больше трех дней, то, вероятно, начнете с такого запроса:

mysql> SELECT COUNT(*), name
-> FROM driver_log
-> WHERE COUNT(*) > 3
-> GROUP BY name;
ERROR 1111 at line 1: Invalid use of group function


Дело в том, что WHERE указывает на исходные ограничения, определяющие, какие строки следует выбирать, но значение функции COUNT() может быть получено лишь после того, как строки выбраны. Необходимо поместить выражение COUNT() в инструкцию HAVING, аналогичную WHERE, но применяемую к групповым характеристикам, а не отдельным записям. То есть HAVING работает с уже выбранным и сгруппированным набором строк, применяя к нему дополнительные условия, сформированные на основе результатов агрегирующей функции, которые не были известны в момент первичной выборки.

Предыдущий запрос можно переписать так:

mysql> SELECT COUNT(*), name
-> FROM driver_log
-> GROUP BY name
-> HAVING COUNT(*) > 3;


+------------+---------+
| COUNT(*) | name |
+------------+---------+
| 5 | Henry |
+-------------+--------+

Если вы используете инструкцию HAVING, то можете включить в запрос и инструкцию WHERE, но только для выбора строк, не для проверки итоговых значений.Инструкция HAVING может ссылаться на псевдонимы:

mysql> SELECT COUNT(*) AS count, name
-> FROM driver_log
-> GROUP BY name
-> HAVING count > 3;


+-------+-------+
| count | name |
+-------+-------+
| 5 | Henry |
+-------+-------+
Теги:
HAVING
Добавлено: 23 Июля 2018 06:34:06 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...