How to group results
Form groups
GROUP BY gathers rows with equal values, then aggregates each group.
SELECT level, COUNT(*) AS course_count
FROM courses
GROUP BY level;
Select grouped values
A grouped query should select only grouped expressions or aggregate results. SQLite may allow other columns, but their values can be arbitrary; PostgreSQL correctly rejects most such queries.
Filter groups with HAVING
WHERE filters rows before grouping; HAVING filters completed groups.
SELECT level, COUNT(*) AS course_count
FROM courses
GROUP BY level
HAVING COUNT(*) >= 3;
Sort the summary
Use ORDER BY after grouping to present the result predictably.
SELECT level, AVG(duration_minutes) AS average_minutes
FROM courses
GROUP BY level
ORDER BY average_minutes DESC;