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

«В чем разница между HAVING и WHERE в SQL?» — вопрос из категории Базы данных и SQL, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основное различие заключается в этапе выполнения запроса, на котором применяется фильтрация.

  • WHERE — фильтрует отдельные строки до группировки (оператор GROUP BY). Он работает с данными на уровне записей таблицы.
  • HAVING — фильтрует после группировки. Он работает с агрегированными результатами, такими как COUNT(), SUM(), AVG().

Практический пример для тестировщика: При проверке отчетов или анализе данных часто нужно убедиться, что группировка и фильтрация работают корректно.

-- WHERE: Исключаем тестовые заказы (status = 'test') перед подсчетом суммы по клиентам.
SELECT customer_id, SUM(amount)
FROM orders
WHERE status != 'test'
GROUP BY customer_id;

-- HAVING: Находим клиентов, у которых общая сумма заказов превышает лимит для проверки бизнес-правила.
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 10000;

-- Комбинирование: Сначала фильтруем строки, затем группируем, затем фильтруем группы.
SELECT customer_id, COUNT(*) as order_count
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) > 5;

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

Видео-ответы