Ответ
Основное различие: WHERE фильтрует строки до их группировки и агрегации, а HAVING фильтрует сгруппированные данные после выполнения агрегатных функций.
Порядок выполнения запроса
Чтобы понять разницу, важно знать упрощенный порядок выполнения SQL-запроса:
FROM/JOINWHERE(фильтрация отдельных строк)GROUP BY(группировка строк)- Агрегатные функции (
SUM,COUNT, ...) HAVING(фильтрация групп)SELECTORDER BY
Ключевые отличия
Объект фильтрации:
WHEREработает с отдельными строками таблицы.HAVINGработает с группами строк, созданнымиGROUP BY.
Использование агрегатных функций:
- В
WHEREнельзя использовать агрегатные функции (SUM,COUNT,AVGи т.д.), так как на этом этапе они еще не вычислены. HAVINGпредназначен именно для фильтрации по результатам агрегатных функций.
- В
Примеры:
Представим таблицу Orders с колонками customer_id, order_date, amount.
WHERE — отфильтровать заказы до группировки
Задача: Найти общую сумму заказов для каждого клиента, но учитывать только заказы дороже 100.
SELECT
customer_id,
SUM(amount) as total_amount
FROM Orders
WHERE amount > 100 -- Сначала отбираем строки, где amount > 100
GROUP BY customer_id;HAVING — отфильтровать результат после группировки
Задача: Найти клиентов, у которых общая сумма всех заказов превышает 1000.
SELECT
customer_id,
SUM(amount) as total_amount
FROM Orders
GROUP BY customer_id
HAVING SUM(amount) > 1000; -- Группируем, считаем SUM и только потом фильтруем группы