Каков логический порядок применения операторов WHERE, GROUP BY и HAVING в SQL?

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

Ответ

Порядок применения определяется логическим порядком выполнения запроса SQL, а не порядком написания в предложении SELECT.

  1. WHERE – Фильтрация отдельных строк исходной таблицы до группировки.
  2. GROUP BY – Группировка отфильтрованных строк по указанным столбцам.
  3. HAVING – Фильтрация уже сгруппированных данных (агрегатов) после группировки.

Пример, иллюстрирующий порядок:

SELECT 
    department_id, 
    COUNT(*) as emp_count, 
    AVG(salary) as avg_salary
FROM employees
-- Шаг 1: Берем только сотрудников, нанятых после 2020 года
WHERE hire_date > '2020-01-01' 
-- Шаг 2: Группируем оставшихся по отделам
GROUP BY department_id             
-- Шаг 3: Оставляем только группы (отделы) с высокой средней зарплатой
HAVING AVG(salary) > 70000;       

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

  • WHERE не может использовать агрегатные функции (как COUNT(), AVG()).
  • HAVING предназначен именно для фильтрации по результатам агрегатных функций или сгруппированным столбцам.