АгрегатыНачальный
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;Связанные термины
Анекдоты по теме
— Что вернёт AVG(salary) если все зарплаты NULL? — NULL. — А SUM? — NULL. — А COUNT(salary)? — 0. COUNT считает непустые, их нет. — А COUNT(*)? — Количество строк. Это COUNT строк, не значений.
Что сказал агрегат SUM после того, как просуммировал колонку с NULL-ами? — Я их просто не заметил. Они для меня не существуют. Как бывших на свадьбе.
— Чем отличается COUNT() от COUNT(колонка)? COUNT() считает всех, даже если у кого-то всё пустое. COUNT(колонка) считает только тех, у кого в этой колонке что-то написано.