DbSchema Tutorial | SQL HAVING CLAUSE
Structured Query Language (SQL) is a potent tool for handling relational databases. One of its vital features is the HAVING
clause, which allows us to filter results after performing an aggregate function. This article delves deep into the world of the HAVING
clause, distinguishing it from WHERE
, and showcasing its applications with various aggregate functions.
1. Introduction to SQL HAVING CLAUSE
The HAVING
clause is used in SQL to filter the results of aggregate functions like SUM, AVG, MAX, etc. Unlike the WHERE
clause, which filters rows before aggregation, HAVING
filters after the aggregation is completed.
Syntax:
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING aggregate_function(column2) condition;
2. Differentiate between SQL HAVING vs WHERE
Attribute | SQL HAVING | SQL WHERE |
---|---|---|
Purpose | Filters aggregated data | Filters individual rows |
Use with | Typically with GROUP BY | Used without GROUP BY (though can be used with) |
Position in SQL | Comes after GROUP BY | Comes before GROUP BY |
3. Using Aggregate Functions with HAVING
a. Using SUM Function
Example: Let’s consider a sample table Orders
:
OrderID | ProductName | Quantity |
---|---|---|
1 | Apples | 50 |
2 | Bananas | 30 |
3 | Apples | 20 |
If we want to find products that have a total quantity greater than 40:
SELECT ProductName, SUM(Quantity) as TotalQuantity
FROM Orders
GROUP BY ProductName
HAVING SUM(Quantity) > 40;
Result:
ProductName | TotalQuantity |
---|---|
Apples | 70 |
b. Using MIN Function
Finding products with the minimum order quantity less than 25:
SELECT ProductName, MIN(Quantity) as MinimumQuantity
FROM Orders
GROUP BY ProductName
HAVING MIN(Quantity) < 25;
Result:
ProductName | MinimumQuantity |
---|---|
(No results matching the criteria) |
c. Using AVG Function
Finding products with an average quantity below 30:
SELECT ProductName, AVG(Quantity) as AverageQuantity
FROM Orders
GROUP BY ProductName
HAVING AVG(Quantity) < 30;
Result:
ProductName | AverageQuantity |
---|---|
Bananas | 30 |
d. Using MAX Function
Finding products with a maximum order quantity greater than 60:
SELECT ProductName, MAX(Quantity) as MaximumQuantity
FROM Orders
GROUP BY ProductName
HAVING MAX(Quantity) > 60;
Result:
ProductName | MaximumQuantity |
---|---|
(No results matching the criteria) |
4. HAVING with GROUP BY and ORDER BY Clauses
a. Filtering Rows Using WHERE and HAVING
Filtering products with a total quantity greater than 20 and grouping those with a total quantity greater than 40:
SELECT ProductName, SUM(Quantity) as TotalQuantity
FROM Orders
WHERE Quantity > 20
GROUP BY ProductName
HAVING SUM(Quantity) > 40;
b. Filtering Rows on Multiple Values Using HAVING
Finding products with a total quantity between 30 and 70:
SELECT ProductName, SUM(Quantity) as TotalQuantity
FROM Orders
GROUP BY ProductName
HAVING SUM(Quantity) BETWEEN 30 AND 70;
Result:
ProductName | TotalQuantity |
---|---|
Apples | 70 |
Bananas | 30 |
c. HAVING with GROUP BY Clause
Grouping by product name and filtering products with a total quantity greater than 40:
SELECT ProductName, SUM(Quantity) as TotalQuantity
FROM Orders
GROUP BY ProductName
HAVING SUM(Quantity) > 40;
Result:
ProductName | TotalQuantity |
---|---|
Apples | 70 |
d. HAVING with ORDER BY Clause
Ordering the grouped results by total quantity in descending order:
SELECT ProductName, SUM(Quantity) as TotalQuantity
FROM Orders
GROUP BY ProductName
HAVING SUM(Quantity) > 40
ORDER BY TotalQuantity DESC;
Result:
ProductName | TotalQuantity |
---|---|
Apples | 70 |
e. HAVING Clause with COUNT() Function
Finding products that have been ordered more than once:
SELECT ProductName, COUNT(OrderID) as NumberOfOrders
FROM Orders
GROUP BY ProductName
HAVING COUNT(OrderID) > 1;
Result:
ProductName | NumberOfOrders |
---|---|
Apples | 2 |
5. Common Mistakes & FAQs
Mistakes
Using
HAVING
withoutGROUP BY
:- The
HAVING
clause is typically used to filter aggregated results. Without theGROUP BY
clause, there’s often little reason to useHAVING
. While some databases might allow this, it’s a misuse of the clause’s intent.
- The
Confusing the order of SQL operations:
- It’s crucial to remember the sequence:
FROM
->WHERE
->GROUP BY
->HAVING
->SELECT
->ORDER BY
. Trying to filter aggregated results usingWHERE
instead ofHAVING
will throw an error.
- It’s crucial to remember the sequence:
Using non-aggregated columns in the HAVING clause without them being in the GROUP BY clause:
- This is a common error. If you’re trying to use a column in the
HAVING
clause that’s not part of an aggregate function, it must also appear in theGROUP BY
clause.
- This is a common error. If you’re trying to use a column in the
Over-relying on HAVING:
- While
HAVING
is powerful, it shouldn’t replaceWHERE
for basic row-level filtering. UseWHERE
wherever possible to reduce the size of the result set early in the processing.
- While
FAQs
Can we use
WHERE
andHAVING
together?- Yes, and it’s common to do so.
WHERE
filters rows before aggregation, whileHAVING
filters after aggregation.
- Yes, and it’s common to do so.
Why is my
HAVING
clause not recognizing a column that’s in mySELECT
statement?- This typically occurs when trying to filter on a column that’s not a part of an aggregate function or the
GROUP BY
clause. If you’re grouping results, every column in theSELECT
that’s not part of an aggregate function needs to be included in theGROUP BY
clause.
- This typically occurs when trying to filter on a column that’s not a part of an aggregate function or the
Can I use aggregate functions in the
WHERE
clause instead ofHAVING
?- No, aggregate functions cannot be used in the
WHERE
clause. If you need to filter based on the result of an aggregate function, you should use theHAVING
clause.
- No, aggregate functions cannot be used in the
Is
HAVING
exclusive to SQL?- While the concept of filtering on aggregated data is not unique to SQL, the
HAVING
clause, as described in this article, is SQL-specific.
- While the concept of filtering on aggregated data is not unique to SQL, the
Can I use
HAVING
without any aggregate functions?- Technically, yes, some databases might allow this, but it’s not standard practice. The purpose of
HAVING
is to filter aggregated results, so using it without aggregations can be confusing and misrepresents its intent.
- Technically, yes, some databases might allow this, but it’s not standard practice. The purpose of
6. Practice Questions
- Write a SQL statement to find products that have an average quantity below 30.
- Find the minimum order quantity for each product, but only display products with a minimum order of more than 20.
- How would you list products that have been ordered more than 3 times, based on the Orders table?
By integrating comprehensive explanations with practical examples, we aim to offer an in-depth understanding of the SQL HAVING
clause. Remember, practice is key. Experiment with different scenarios and datasets to refine your SQL skills.
Happy Querying