HAVING
Фильтрует группы после GROUP BY. В отличие от WHERE, может использовать агрегатные функции.
SELECT col, AGG(col2) FROM table GROUP BY col HAVING AGG(col2) > value;
Объяснение
Пример
-- Пользователи с более чем 5 заказами на сумму > 10000 SELECT user_id, COUNT(*) AS cnt, SUM(total) AS total FROM orders GROUP BY user_id HAVING COUNT(*) > 5 AND SUM(total) > 10000;
Связанные термины
Анекдоты по теме
Аналитик пишет SUM(revenue) и получает NULL. Он в панике звонит DBA. DBA: проверь, есть ли NULL в колонке revenue. Аналитик: есть несколько. DBA: один NULL заражает всю сумму. Используй SUM(COALESCE(revenue, 0)).
Аналитик хочет топ-3 продукта в каждой категории. Пишет GROUP BY, ORDER BY, LIMIT 3. Получает топ-3 вообще, не по категориям. DBA: тебе нужна оконная функция. ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) Потом WHERE rn <= 3. Аналитик: почему это не просто LIMIT 3 внутри GROUP BY?! DBA: потому что SQL так работает.
— Что вернёт AVG(salary) если все зарплаты NULL? — NULL. — А SUM? — NULL. — А COUNT(salary)? — 0. COUNT считает непустые, их нет. — А COUNT(*)? — Количество строк. Это COUNT строк, не значений.