HAVING

Базовый SQL
≈ 1 мин чтения

HAVING фильтрует группы

WHERE фильтрует отдельные строки до группировки. HAVING применяется уже к результату группировки и позволяет оставить только группы, подходящие по агрегированному условию.

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) >= 5;

Сначала заказы объединяются по customer_id, затем для каждой группы считается количество строк, и только группы с пятью или более заказами остаются в результате.

WHERE и HAVING могут работать вместе

SELECT customer_id, SUM(amount) AS total
FROM orders
WHERE status = 'PAID'
GROUP BY customer_id
HAVING SUM(amount) > 10000;

WHERE сначала оставляет только оплаченные заказы. Затем они группируются по клиенту, после чего HAVING оставляет клиентов с суммой оплат больше 10000.

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