В SQL: когда использовать HAVING вместо WHERE?

«В SQL: когда использовать HAVING вместо WHERE?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Синтаксический порядок:

SELECT column1, AGGREGATE_FUNCTION(column2)
FROM table
WHERE condition_on_rows    -- Фильтрация строк ДО группировки
GROUP BY column1
HAVING condition_on_group  -- Фильтрация групп ПОСЛЕ агрегации

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

SELECT 
    department_id, 
    COUNT(*) AS employee_count,
    AVG(salary) AS avg_salary
FROM employees
WHERE active = TRUE  -- Учитываем только активных сотрудников (фильтр строк)
GROUP BY department_id
HAVING 
    COUNT(*) > 5 
    AND AVG(salary) > 50000;  -- Фильтр по результатам агрегации

Ключевые правила:

  1. WHERE не может содержать агрегатные функции.
  2. HAVING может содержать как агрегатные функции, так и обычные колонки из GROUP BY.
  3. HAVING применяется после GROUP BY, WHERE — до.

Когда использовать HAVING:

  • Нужно отфильтровать итоговые группы по результату вычислений (например, "отделы, где сумма продаж > 1M").
  • Условие включает агрегатную функцию (SUM(amount) > 1000).