Ответ
Основное различие заключается в этапе выполнения запроса, на котором применяется фильтрация.
- 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 — может. Оба могут использоваться в одном запросе для точной фильтрации данных.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶