Этот вопрос проверяет знание порядка фильтрации строк до и после агрегации.
WHERE фильтрует строки до группировки и агрегации, а HAVING — после, уже по результатам агрегатных функций. WHERE не может использовать агрегаты, а HAVING предназначен как раз для условий по COUNT, SUM и т.д.
WHERE:
Отбирает отдельные строки.
Применяется перед GROUP BY.
Нельзя писать WHERE COUNT(*) > 1.
HAVING:
Фильтрует группы, полученные GROUP BY.
Может использовать агрегатные функции:
SELECT user_id, COUNT(*) AS cnt
FROM orders
WHERE status = 'completed'
GROUP BY user_id
HAVING COUNT(*) > 5;Порядок выполнения:
FROM → 2. WHERE → 3. GROUP BY → 4. HAVING → 5. SELECT → 6. ORDER BY
Вывод:
WHERE для фильтрации строк, HAVING — для фильтрации агрегатов.