В чем разница между WHERE и HAVING в SQL и зачем использовать HAVING после GROUP BY?
Что проверяют
Понимаете ли вы порядок выполнения запроса. Отсюда следует всё остальное.
Как отвечать
WHERE фильтрует строки до группировки, HAVING фильтрует уже готовые группы после неё. Поэтому в WHERE нельзя использовать агрегатные функции: на этом этапе групп ещё нет.
select company, count(*) as jobs
from jobs
where is_active -- отбираем строки
group by company
having count(*) > 10 -- отбираем группы
order by jobs desc;Логический порядок выполнения полезно назвать целиком: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT. Отсюда сразу два следствия: в WHERE не видны псевдонимы из SELECT, а в HAVING уже видны агрегаты.
Практическая разница не только в семантике, но и в скорости. Условие, которое можно проверить на строке, всегда ставят в WHERE: оно отсечёт данные до группировки, и группировать придётся меньше. Ставить такое условие в HAVING значит сгруппировать всё, а потом выбросить.
HAVING без GROUP BY формально допустим: тогда вся выборка считается одной группой, и он фильтрует агрегат по ней целиком.
Где спотыкаются
Пишут агрегат в WHERE и получают ошибку.
Ставят обычное условие в HAVING, теряя производительность.
Ждут, что в WHERE сработает псевдоним из SELECT.
Не могут объяснить логический порядок выполнения, из-за чего путаются в остальных вопросах про SQL.