Давайте разберем разницу между операторами HAVING и WHERE, о чем частенько спрашивают на собеседованиях.
🟦 Основные отличия:
1. Когда используются:
- WHERE применяется для фильтрации строк до того, как они будут сгруппированы. То есть, он работает на уровне отдельных записей.
- HAVING, с другой стороны, используется для фильтрации групп после того, как они были созданы с помощью агрегатных функций (например, SUM, COUNT, AVG и т.д.) или же в связке с GROUP BY.
То есть, WHERE не поддерживает агрегатные функции, потому что он работает с индивидуальными записями, а HAVING может использовать агрегатные функции, так как он работает с результатами группировки.
2. Пример использования:
- Если стоит задача выбрать все заказы, сделанные клиентами с определенной суммой, ты используем WHERE:
SELECT * FROM orders
WHERE amount > 100;
- Если же требуется получить только те группы клиентов, у которых сумма заказов превышает определенное значение, тогда используем HAVING:
SELECT customerid, SUM(amount) AS totalamount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 500;
☝️ Важный момент:
Если в запросе применяется и WHERE, и HAVING, то в синтаксисе SQL сначала должен выполняться WHERE, а потом HAVING.