WHERE фильтрует строки до группировки и агрегации. HAVING фильтрует результат после GROUP BY (по агрегатам и сгруппированным полям). В HAVING можно использовать агрегатные функции (COUNT, SUM и т.д.), в WHERE - нет.
SELECT dept, COUNT(*) AS cnt
FROM employees
WHERE salary > 50000
GROUP BY dept
HAVING COUNT(*) > 5
-- WHERE отсекает сотрудников с salary <= 50000
-- HAVING оставляет только отделы с более чем 5 такими сотрудниками