WHERE vs HAVING: в чём разница — разбор для собеса

WHERE и HAVING — обе фильтруют, но в разные моменты выполнения запроса. WHERE отсекает строки до того, как они попадут в GROUP BY, HAVING — уже сформированные группы. На собесе часто проверяют именно это.

Если коротко. WHERE — фильтр по строкам до агрегации. HAVING — фильтр по агрегатам (COUNT/SUM/AVG) после GROUP BY.
Проверь себя · 1/3разбор после ответа
Что делает HAVING?

WHERE vs HAVING: таблица различий

ПараметрWHEREHAVING
Когда выполняетсяДо GROUP BYПосле GROUP BY
С чем работаетСо строками таблицыС группами/агрегатами
Можно использовать агрегаты?НетДа (COUNT, SUM, AVG…)
СкоростьБыстрее (фильтр до агрегации)Медленнее (агрегаты уже посчитаны)
Без GROUP BY?ДаДа, но смысла мало

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

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

На примере

WHERE — фильтр строк
SELECT user_id, COUNT(*) AS orders
FROM orders
WHERE status = 'completed'   -- до GROUP BY
GROUP BY user_id;
HAVING — фильтр групп
SELECT user_id, COUNT(*) AS orders
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;       -- после GROUP BY

Ловушка на собесе

Классическая ловушка: WHERE COUNT(*) > 5 — это ошибка. Агрегаты в WHERE не работают, для них есть HAVING. Если хочется отфильтровать строки до агрегации И группы после, используйте оба сразу.
Тренировать SQL в Telegram

Ещё сравнения по теме