Files
databases.softwareshinobi.com/landing/docs/SQL-101/007-order-and-group-by.md
Software Shinobi caa5bbb983
All checks were successful
learn org at code.softwareshinobi.com/databases.softwareshinobi.com/pipeline/head This commit looks good
rewriting
2025-06-19 13:04:08 -04:00

3.3 KiB

ORDER By, GROUP By, HAVING

Applying structure and performance considerations when querying data is paramount. ORDER BY provides sorted result sets, essential for presentation and predictable processing. GROUP BY aggregates data, enabling summary reporting and analytical operations, often combined with functions like COUNT, MIN , or MAX. The HAVING clause refines these aggregations, filtering grouped data based on conditions applied after aggregation.

ORDER BY

Use ORDER BY to enforce a specific order on your query results. Specify one or more columns ; multiple columns are comma-separated.

Consider a simple selection from a users table without ordering:

SELECT id, username FROM users;

Typical output without ORDER BY relies on internal database storage order (often clustered by primary key), not a guaranteed sequence:

id username
2 shinobi
3 Java Team Six
4 tony
5 shinobi
6 Java Team Six
7 tony

To ensure results are sorted by username alphabetically (ascending):

SELECT id, username FROM users ORDER BY username;

Output ordered by username:

id username
2 shinobi
5 shinobi
3 Java Team Six
6 Java Team Six
4 tony
7 tony

ORDER BY defaults to ascending (ASC). Explicitly specify DESC for descending order.

Sort usernames in reverse alphabetical order:

SELECT id, username FROM users ORDER BY username DESC;

Output in descending username order:

id username
4 tony
7 tony
3 Java Team Six
6 Java Team Six
2 shinobi
5 shinobi

Place ORDER BY after the WHERE clause when both are used.

GROUP BY

GROUP BY aggregates rows with identical values in specified columns into summary rows. This clause is typically used with aggregate functions (COUNT, SUM, AVG, MIN, MAX) to perform calculations on each group.

To count users sharing the same username:

SELECT COUNT(username), username FROM users GROUP BY username;

This groups users by identical usernames and counts entries within each group:

COUNT(username) username
2 shinobi
2 Java Team Six
2 tony

GROUP BY follows FROM and WHERE clauses.

HAVING Clause

HAVING filters groups created by GROUP BY. Unlike WHERE, which filters individual rows before grouping, HAVING filters grouped rows based on conditions, often involving aggregate functions.

Identify usernames that appear more than once:

SELECT COUNT (username), username
FROM users
GROUP BY username
HAVING COUNT(username) > 1;

This groups users by username, counts occurrences, and then filters to show only groups where the count is greater than 1:

COUNT(username) username
2 shinobi
2 Java Team Six
2 tony

WHERE filters rows before aggregation; HAVING filters groups after aggregation.