АгрегатыНачальный
HAVING
Фильтрует группы после GROUP BY. В отличие от WHERE, может использовать агрегатные функции.
Синтаксис
SELECT col, AGG(col2) FROM table GROUP BY col HAVING AGG(col2) > value;
Объяснение
HAVING применяется после GROUP BY и может содержать агрегатные функции. WHERE — до GROUP BY, агрегаты там недоступны.
Правило: если условие не использует агрегат — лучше вынести его в WHERE для производительности.
Пример
-- Пользователи с более чем 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;
Связанные термины
Анекдоты по теме
Почему GROUP BY не зовут на дни рождения? Потому что он всех складывает в кучу и выдаёт по одному подарку на группу.
— Как удалить дубликаты из таблицы? — DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email ); — Это удалит все дубли кроме первого? — Именно. MIN(id) оставляет самую раннюю запись.
Аналитик пишет SUM(revenue) и получает NULL. Он в панике звонит DBA. DBA: проверь, есть ли NULL в колонке revenue. Аналитик: есть несколько. DBA: один NULL заражает всю сумму. Используй SUM(COALESCE(revenue, 0)).