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

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

Ответ

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 не может содержать агрегатные функции.