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, что работает, но медленнее.