Ответ
Порядок применения определяется логическим порядком выполнения запроса SQL, а не порядком написания в предложении SELECT.
WHERE– Фильтрация отдельных строк исходной таблицы до группировки.GROUP BY– Группировка отфильтрованных строк по указанным столбцам.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предназначен именно для фильтрации по результатам агрегатных функций или сгруппированным столбцам.