Предположим, что в предыдущем примере, вы хотели бы увидеть только те имена, которые повторяются более двух раз. Вы не сможете использовать агрегатную функцию в предложении WHERE потому что агрегатные функции находятся после того как предложении WHERE уже отработало.
Предложение HAVING определяет критерии используемые чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк. Для GROUP BY ключевое слово HAVING играет ту же роль, что и WHERE для ORDER BY. Другими словами, WHERE задает условия для значений из выбранных столбцов, а HAVING задает условия для групп, создаваемых с помощью GROUP BY.
Ключевое слово HAVING в операторе SELECT должно следовать за выражением ключевого слова GROUP BY и тоже предшествовать ключевому слову ORDER BY, если последнее используется. Синтаксис:
[GROUP BY <список столбцов> [HAVING <условия поиска>]]
Основным требованием к составу предложения HAVING является то, что имена столбцов в этом предложении обязательно должны присутствовать в списке GROUP BY или быть параметрами агрегатной функции.
При выполнении такого оператора SELECT делается все то же самое, что и при обычном SELECT — выбираются указанные столбцы строк, соответствующие условию в предложении WHERE, вычисляются значения агрегатных функций. После этого выполняется группировка по столбцам, перечисленным в предложении GROUP BY. Затем осуществляется дополнительная "фильтрация" строк на основании условия в предложении HAVING.
Найдем сколько каких имен содержится в нашем списке показывая только те имена, которые повторяются более двух раз:[30]
SELECT COUNT (*) AS "Количество",PR_NAME2
FROM PERSON
GROUP BY PR_NAME2
HAVING COUNT (*) > 2
ORDER BY 1DESC ,PR_NAME2
Листинг 15. Количество каждого имени в списке людей при условии что это количество превышает 2.
Количество
PR_NAME2
Елена
Наталья
Татьяна
Светлана
Марина
Ирина
Оксана
Ольга
Екатерина
Юлия
Сергей
Александр
Анна
Алексей
Дмитрий
Надежда
Олег
Вера
Людмила
Мария
Владимир
Ксения
Лариса
Максим
Мы получили все те данные, которые нам были нужны.
В процессе обработки запроса система выполняет такие действия.
1. Отбираются те строки, которые соответствуют условию поиска в предложении WHERE, если таковое имеется. В нашем примере это предложение отсутствует.
2. Выбранные строки объединяются в группы на основании значения имени (PR_NAME2).
3. Для каждой группы рассчитываются значения агрегатных функций. При этом для каждой группы создается одна результирующая строка.
4. Полученные в результате строки упорядочиваются в соответствии с предложением ORDER BY (в нашем случае — по количеству строк в группе).