В чем разница между операторами WHERE и HAVING в SQL?

Ответ

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

Порядок выполнения запроса

Чтобы понять разницу, важно знать упрощенный порядок выполнения SQL-запроса:

  1. FROM / JOIN
  2. WHERE (фильтрация отдельных строк)
  3. GROUP BY (группировка строк)
  4. Агрегатные функции (SUM, COUNT, ...)
  5. HAVING (фильтрация групп)
  6. SELECT
  7. ORDER BY

Ключевые отличия

  1. Объект фильтрации:

    • WHERE работает с отдельными строками таблицы.
    • HAVING работает с группами строк, созданными GROUP BY.
  2. Использование агрегатных функций:

    • В 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 и только потом фильтруем группы