Для чего в SQL используется оператор HAVING?

«Для чего в SQL используется оператор HAVING?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор HAVING применяется для фильтрации групп записей, созданных оператором GROUP BY, на основе условий, включающих агрегатные функции (COUNT, SUM, AVG, MAX, MIN).

Ключевое отличие от WHERE:

  • WHERE фильтрует отдельные строки до их группировки.
  • HAVING фильтрует целые группы после выполнения группировки и агрегации.

Пример: Найти отделы со средней зарплатой сотрудников выше 70 000 и численностью более 5 человек.

SELECT 
    department_id,
    COUNT(*) AS employee_count,
    AVG(salary) AS average_salary
FROM employees
WHERE active = TRUE -- Фильтрация строк ДО группировки
GROUP BY department_id
HAVING 
    AVG(salary) > 70000 AND -- Условие по агрегатной функции
    COUNT(*) > 5;          -- Еще одно условие по агрегатной функции

Типичные сценарии использования HAVING:

  1. Фильтрация по агрегированным значениям: Отбор групп, где сумма, среднее или максимум превышает заданный порог.
  2. Фильтрация по количеству элементов в группе: Найти категории товаров с более чем N заказами, пользователей, совершивших более M транзакций.
  3. Анализ данных после JOIN: Фильтрация результатов сложных запросов с соединениями и группировкой.

Важно: В условии HAVING можно использовать как агрегатные функции, так и столбцы, по которым выполнена группировка (GROUP BY).