Обработка данных в группировке
Вы уже умеете группировать по нескольким полям конструкцией GROUP BY.
Что если нужно сразу вывести авторов, у которых в таблицу попало больше одной книги? Для таких целей есть конструкция HAVING (англ. «обладающий»).
Пример формата запроса с конструкцией HAVING:
Скопировать кодSQL
SELECT
поле_1,
поле_2,
...,
поле_n,
АГРЕГИРУЮЩАЯ_ФУНКЦИЯ(поле) AS here_you_are
FROM
TABLE
WHERE
условие
GROUP BY
поле_1,
поле_2,
...,
поле_n
HAVING
АГРЕГИРУЮЩАЯ_ФУНКЦИЯ(поле_для_группировки) > n
ORDER BY
поле_1,
поле_2,
...,
поле_n,
here_you_are
LIMIT
n;
В результирующую выборку попадут только те строки, для которых результат агрегирующей функции соответствует условию блоков HAVING и WHERE.
Если команды HAVING и WHERE так похожи, почему нельзя записать все условия в одной из них? Дело в том, что WHERE отрабатывает перед группировкой данных и расчётом агрегирующей функции. Потому задать фильтр на результат агрегирующей функции в WHERE нельзя. И здесь выручает HAVING.
Таблица с книгами:
Вернёмся к задаче с авторами. Выберем только тех, у кого больше одной книги:
Скопировать кодSQL
SELECT
author,
COUNT(name) AS name_cnt
FROM
books
GROUP BY
author
HAVING
COUNT(name) > 1
ORDER BY
name_cnt DESC;
Обратите внимание на порядок команд:
1) GROUP BY;
2) HAVING;
3) ORDER BY.
Указывайте команды строго в этой последовательности, иначе запрос не выполнится.