Обработка данных в группировке

Вы уже умеете группировать по нескольким полям конструкцией 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.
image
Таблица с книгами:
idNamegenreauthordate_pubpagespricerating
1Капитанская дочка5Александр Пушкин1836-01-011301504.7
2Отцы и дети1Иван Тургенев1861-01-012402074.7
3Вишнёвый сад7Антон Чехов1903-01-01601384.4
4Война и мир1Лев Толстой1869-01-011274
5Анна Каренина1Лев Толстой1878-01-0110001264.6
6Цветы для Элджернона4Дэниел Киз1959-01-012502804.7
7Похороните меня за плинтусом...5Павел Санаев1994-01-011841984.1
8Зелёная миля9Стивен Кинг1996-01-014201904.8
9Унесённые ветром1Маргарет Митчелл1936-01-01624358
10Три товарища1Эрих Мария Ремарк1929-01-014701964.7
11На Западном фронте без перемен4Эрих Мария Ремарк1945-01-012002734.6
12Триумфальная арка1Эрих Мария Ремарк1956-01-015202204.7
13Чёрный обелиск1Эрих Мария Ремарк1961-01-014804204.6
14Ночь в Лиссабоне1Эрих Мария Ремарк1959-01-012501874.7
15Жизнь взаймы1Эрих Мария Ремарк1927-01-012402404.6
16Станция на горизонте1Эрих Мария Ремарк1830-01-012104.1
17Евгений Онегин1Александр Пушкин1820-01-017363304.7
Вернёмся к задаче с авторами. Выберем только тех, у кого больше одной книги:
Скопировать кодSQL
SELECT author, COUNT(name) AS name_cnt FROM books GROUP BY author HAVING COUNT(name) > 1 ORDER BY name_cnt DESC;
namename_cnt
Эрих Мария Ремарк7
Александр Пушкин2
Лев Толстой2
Обратите внимание на порядок команд:
1) GROUP BY;
2) HAVING;
3) ORDER BY.
Указывайте команды строго в этой последовательности, иначе запрос не выполнится.