WHERE vs HAVING: в чём разница — разбор для собеса
WHERE и HAVING — обе фильтруют, но в разные моменты выполнения запроса. WHERE отсекает строки до того, как они попадут в GROUP BY, HAVING — уже сформированные группы. На собесе часто проверяют именно это.
Если коротко. WHERE — фильтр по строкам до агрегации. HAVING — фильтр по агрегатам (COUNT/SUM/AVG) после GROUP BY.
Проверь себя · 1/3разбор после ответа
Что делает
HAVING?WHERE vs HAVING: таблица различий
Когда использовать WHERE
- Нужно отфильтровать строки по значениям колонок таблицы.
- Условие не использует агрегатные функции.
- Хотите снизить объём данных до группировки — это быстрее.
Когда использовать HAVING
- Нужно отфильтровать уже агрегированные значения (COUNT/SUM/AVG/MIN/MAX).
- Условие зависит от результата GROUP BY.
- Хотите выбрать только группы, попадающие под порог (например, заказов > 5).
На примере
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. Если хочется отфильтровать строки до агрегации И группы после, используйте оба сразу.