АгрегатыНачальный
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;
Связанные термины
Анекдоты по теме
Почему HAVING обижается на WHERE? — Потому что WHERE фильтрует строки ДО группировки, а HAVING — ПОСЛЕ. WHERE думает, что он главный, а HAVING знает: истина где-то в агрегатах.
— Что вернёт AVG(salary) если все зарплаты NULL? — NULL. — А SUM? — NULL. — А COUNT(salary)? — 0. COUNT считает непустые, их нет. — А COUNT(*)? — Количество строк. Это COUNT строк, не значений.
— Чем HAVING отличается от WHERE? — WHERE фильтрует строки ДО группировки. HAVING — ПОСЛЕ. — Как охранник на входе и на выходе? — Именно. И оба нужны.