
When working with SQL queries, I often come across situations where I need to filter aggregated results. That’s where the HAVING
clause comes into play. In this article, I’ll explain how HAVING
works in SQL, provide examples, and compare it with the WHERE
clause to ensure you get the best understanding of its usage.
Understanding the HAVING Clause
The HAVING
clause in SQL is used to filter results after they have been grouped using the GROUP BY
statement. Unlike the WHERE
clause, which filters rows before aggregation, HAVING
filters groups of data after aggregate functions have been applied.
Basic Syntax of HAVING
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING condition;
Here’s what each part does:
SELECT
– Specifies the columns to retrieve.FROM
– Specifies the source table.GROUP BY
– Groups results based on a specified column.HAVING
– Filters the grouped results based on a condition.
HAVING vs WHERE: What’s the Difference?
Feature | WHERE | HAVING |
---|---|---|
Execution order | Filters rows before aggregation | Filters grouped results after aggregation |
Usage with aggregate functions | Cannot use aggregate functions | Can use aggregate functions |
Requires GROUP BY | No | Yes |
Simple Example of HAVING
Let’s say I have a sales table with the following data:
CREATE TABLE Sales (
id INT PRIMARY KEY,
salesperson VARCHAR(100),
amount DECIMAL(10,2)
);
INSERT INTO Sales (id, salesperson, amount) VALUES
(1, 'Alice', 500),
(2, 'Bob', 700),
(3, 'Alice', 300),
(4, 'Bob', 400),
(5, 'Charlie', 600);
If I want to find salespeople who have sold more than $500 in total, I can use:
SELECT salesperson, SUM(amount) AS total_sales
FROM Sales
GROUP BY salesperson
HAVING SUM(amount) > 500;
This returns:
salesperson | total_sales |
---|---|
Alice | 800 |
Bob | 1100 |
Using HAVING with Multiple Conditions
I can also use multiple conditions in a HAVING
clause. If I want to find salespeople whose total sales exceed $500 but are less than $1000, I’d do:
SELECT salesperson, SUM(amount) AS total_sales
FROM Sales
GROUP BY salesperson
HAVING SUM(amount) > 500 AND SUM(amount) < 1000;
This would return only Alice because her total sales are within that range.
Combining HAVING with WHERE
To maximize query efficiency, I often use WHERE
to filter rows before aggregation and HAVING
to filter after aggregation. For example:
SELECT salesperson, SUM(amount) AS total_sales
FROM Sales
WHERE amount > 200 -- Filters individual sales greater than 200
GROUP BY salesperson
HAVING SUM(amount) > 500;
Here, WHERE
ensures only sales over $200 are considered, then HAVING
filters the grouped results.
Conclusion
The HAVING
clause is essential for filtering aggregated data in SQL. By understanding the difference between WHERE
and HAVING
, I can write more efficient and meaningful queries. Whether filtering total sales, average scores, or any other aggregated data, HAVING
is a powerful tool in SQL.
Other interesting article:
How ORDER BY works in SQL? Best ORDER BY examples