WHERE фильтрует строки перед группировкой; HAVING фильтрует группы после агрегации.
Пример
SELECT user_id, SUM(amount) AS revenue
FROM orders
WHERE status = 'completed'
GROUP BY user_id
HAVING SUM(amount) > 10000
ORDER BY revenue DESC;
Итог
WHERE фильтрует строки перед группировкой; HAVING фильтрует группы после агрегации.