WHERE фильтрует строки до группировки. HAVING фильтрует группы после GROUP BY (по агрегатам).
Разбор
- WHERE — условия на «сырые» колонки строк.
- HAVING — условия на
COUNT(*), SUM(), AVG() и т.д.
- Нельзя в WHERE ссылаться на alias агрегата из SELECT.
- Порядок: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
Итог
WHERE — до GROUP BY; HAVING — фильтр агрегированных групп.