How to filter grouped entries with SQL HAVING
SQL HAVING is a condition that can be applied to already grouped entries. It works with aggregate functions to restrict result sets.
What is SQL HAVING?
In addition to the familiar WHERE
clause, there is another condition in Structured Query Language that is frequently used: SQL HAVING
. This condition filters data based on specific criteria. It is applied with the SQL command SELECT
and the SQL GROUP BY statement. While GROUP BY
groups results, SQL HAVING
restricts the result set using different aggregate functions. The condition was introduced because WHERE
cannot interact with aggregate functions such as SQL AVG(), SQL COUNT(), MAX()
, MIN()
and SUM()
. SQL HAVING
is used after the statements WHERE
(if available) and GROUP BY
, but before ORDER BY
.
- Unlimited traffic and up to 1 Gbit/s bandwidth
- Fast SSD NVMe storage
- Free Plesk Web Host Edition
Syntax and function
To understand how SQL HAVING
works and its benefits, it’s worth taking a look at the syntax of the clause:
SELECT name_of_column(n)
FROM name_of_table
WHERE condition
GROUP BY name_of_column(n)
HAVING condition
ORDER BY name_of_column(n);
sqlAn aggregate function is often applied to one or more columns, followed by specifying the table name for localisation. The WHERE
condition is optional. GROUP BY
combines identical values into groups, which can be further filtered with HAVING
and ordered with ORDER BY
.
Example of the condition
The easiest way to illustrate SQL HAVING
is with the help of a simple example. To do this, we create a small table called ‘Customer list’. This contains the columns ‘Customer number’, ‘Name’, ‘Location’ and ‘Item’:
Customer Number | Name | Location | Item |
---|---|---|---|
1427 | Smith | Newcastle | 13 |
1377 | Johnson | Barnsley | 9 |
1212 | Brown | Barnsley | 15 |
1431 | Davis | Edinburgh | 22 |
1118 | Wilson | Cardiff | 10 |
Now we use SQL HAVING
to find out how many customers from Barnsley have ordered ten or more items. To do this, we use the following code and specify the number using an SQL alias as ‘NumberOrders’:
SELECT Location, COUNT(Location) AS NumberOrders
FROM CustomerList
WHERE Location = 'Barnsley'
GROUP BY location, article
HAVING Article > 10;
sqlThe corresponding output is:
Location | OrderCount |
---|---|
Barnsley | 1 |
The condition combined with INNER JOIN
You can also combine SQL HAVING
with the keyword INNER JOIN
. To do this, we create a second table called ‘Article_01’, which stores how often and when a particular article was ordered. It contains an order number, a customer number, the quantity, and an order date and looks like this:
Order number | Customer number | Quantity | Date |
---|---|---|---|
00283 | 1427 | 4 | 2024-01-15 |
00284 | 1211 | 7 | 2024-01-19 |
00285 | 1275 | 15 | 2024-01-29 |
00286 | 1431 | 10 | 2024-02-01 |
00287 | 1427 | 9 | 2024-02-05 |
Now we can now instruct the system to show us all customers who have placed more than one order. The appropriate code is this one:
SELECT Customer list.name, COUNT(Article_01.order number) AS NumberOrders
FROM (Article_01
INNER JOIN Customer list ON Article_01.customer_number = Customer_01.customer_number)
GROUP BY Name
HAVING COUNT(Article_01.OrderNumber) > 1;
sqlWe get the following ouput:
Name | Order Count |
---|---|
Smith | 2 |
Alternatives to SQL HAVING
An alternative to SQL HAVING
is WHERE
. However, the two options cannot be used in exactly the same way. WHERE
is used for individual entries and can also be combined with DELETE
or UPDATE
in addition to SELECT
. HAVING
, on the other hand, is only intended for grouped entries and is only compatible with SELECT
. WHERE
is used before GROUP BY
and HAVING
after. In addition, only SQL HAVING
can work with aggregate functions.
A server that’s perfectly tailored to your needs: With SQL Server Hosting from IONOS, you can choose between MSSQL, MySQL, and MariaDB, benefiting from a robust security architecture, outstanding performance, and personalised advice at all times.