GROUP BY grupuje wiersze do agregacji. HAVING filtruje grupy po agregacji (a WHERE filtruje wiersze przed grupowaniem). Np. „tylko grupy z count > 10”.
SELECT country, COUNT(*) AS cnt FROM users GROUP BY country HAVING COUNT(*) > 10;