# The SQL HAVING
clause
When we use an aggregate function in a query, such as COUNT
, SUM
, or AVG
, we can't then filter by the result of that aggregation.
For example, this query:
SELECT poll_id, COUNT(id) AS option_count
FROM options
GROUP BY poll_id;
It might give us something like this:
poll_id | option_count |
---|---|
1 | 3 |
2 | 2 |
3 | 3 |
If you want to for those rows that have a count of 3 or more, you'd think that this would work:
SELECT poll_id, COUNT(id) AS option_count
FROM options
GROUP BY poll_id
WHERE option_count > 2;
But it does not, because the WHERE
clause is evaluated before the aggregation happens.
# Using HAVING
Instead, to evaluate on the result of the aggregate function, we must use the HAVING
clause:
SELECT poll_id, COUNT(id) AS option_count
FROM options
GROUP BY poll_id
HAVING COUNT(id) > 2;
WARNING
Note that you can't use the column alias in the HAVING
clause. You must use the entire aggregate function.
However, this won't run the aggregate function twice (so it's not a performance problem)[1].
# Wrapping Up
Alright, that's about everything for the HAVING
clause. It can be really handy when you want to filter our grouped rows!