Gymterview
junior

В чем различие между операторами HAVING и WHERE?

WHERE фильтрует строки до группировки и вычисления агрегатных функций, а HAVING фильтрует группы после группировки и агрегации. Это ключевое различие, определяющее, где какой оператор использовать.

Характеристика WHERE HAVING
Момент выполнения До GROUP BY После GROUP BY
Работает с Отдельными строками Группами строк
Агрегатные функции Нельзя использовать Можно и нужно использовать
Без GROUP BY Используется самостоятельно Технически возможно, но бессмысленно
Влияние на производительность Уменьшает количество строк для группировки Фильтрует уже вычисленные группы
Пример
-- WHERE отбирает строки для агрегации
-- HAVING фильтрует результаты агрегации
SELECT department, COUNT(*) AS emp_count
FROM employees
WHERE status = 'active'          -- сначала: только активные сотрудники
GROUP BY department
HAVING COUNT(*) > 5;             -- потом: только отделы с более чем 5 активными

Из соображений производительности фильтрацию строк лучше выносить в WHERE, а не в HAVING. Предложение WHERE уменьшает количество данных, которые нужно группировать, что делает запрос быстрее.

На собеседовании: покажите, что понимаете порядок выполнения: WHERE -> GROUP BY -> HAVING. Частая ошибка — написать условие фильтрации по обычному столбцу в HAVING вместо WHERE, что работает, но медленнее.