АгрегатыНачальный
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 знает: истина где-то в агрегатах.
— Почему агрегатные функции ненавидят NULL? — Потому что COUNT() их считает, а SUM(колонка) — игнорирует. Двойные стандарты!
— Зачем нужен DISTINCT в COUNT? — COUNT(DISTINCT user_id) считает уникальных пользователей. — А COUNT(user_id) без DISTINCT? — Считает все посещения, включая повторные. — Это как считать людей на концерте vs количество входов.