Ответ
WHERE и HAVING — это предложения для фильтрации данных в SQL-запросе, но они применяются на разных этапах выполнения.
Ключевые отличия
- WHERE фильтрует строки до группировки (операции
GROUP BY). Он работает с отдельными записями исходной таблицы. - HAVING фильтрует результаты после группировки. Он работает с агрегированными данными (группами).
Практический пример
Предположим, есть таблица orders с полями customer_id и amount.
-- WHERE: Отфильтровать отдельные заказы на сумму > 100, а затем сгруппировать.
-- Фильтрация происходит ДО вычисления SUM.
SELECT customer_id, SUM(amount) as total_spent
FROM orders
WHERE amount > 100
GROUP BY customer_id;
-- HAVING: Сначала сгруппировать все заказы по клиентам, затем отфильтровать группы.
-- Фильтрация происходит ПОСЛЕ вычисления SUM.
SELECT customer_id, SUM(amount) as total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;
Правило выбора
- Используйте WHERE для фильтрации по полям, не участвующим в агрегации.
- Используйте HAVING для фильтрации по результатам агрегатных функций (
SUM,COUNT,AVG,MIN,MAX).WHEREне может содержать агрегатные функции.