Ответ
Основное различие: WHERE
фильтрует строки до их группировки и агрегации, а HAVING
фильтрует сгруппированные данные после выполнения агрегатных функций.
Порядок выполнения запроса
Чтобы понять разницу, важно знать упрощенный порядок выполнения SQL-запроса:
FROM
/JOIN
WHERE
(фильтрация отдельных строк)GROUP BY
(группировка строк)- Агрегатные функции (
SUM
,COUNT
, ...) HAVING
(фильтрация групп)SELECT
ORDER 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 и только потом фильтруем группы