MySQL | HAVING
Start your free 7-days trial now!
MySQL's HAVING
clause is used to specify a condition involving aggregate functions. It is used in GROUP BY
queries, and specifies a condition upon the grouped results.
The WHERE
clause specifies a condition that a record must meet before it is considered for grouping, while the HAVING
clause specifies the condition that should be applied after the grouping and aggregation takes place.
Syntax
SELECT column_name(s)FROM table_nameGROUP BY columnHAVING conditionORDER BY column;
Examples
Consider the following table about whether students hold a drivers license:
student_id | full_name | age | has_license |
---|---|---|---|
1 | Sky Towner | 17 | 0 |
2 | Ben Davis | 19 | 1 |
3 | Travis Apple | 18 | 0 |
4 | Arthur David | 16 | 0 |
5 | Benjamin Town | 17 | 1 |
The above sample table can be created using the code here.
Basic usage
To find the ages where there is only one student of that age:
SELECT age, COUNT(*)FROM drivers_licenseGROUP BY ageHAVING COUNT(*) = 1;
+------+----------+| age | COUNT(*) |+------+----------+| 19 | 1 || 18 | 1 || 16 | 1 |+------+----------+
Note age 17
is not returned as there are two students who are 17
.
Using HAVING with WHERE
To include a WHERE
clause to filter out students with full_name='Sky Towner'
before we perform grouping:
SELECT age, COUNT(*)FROM drivers_licenseWHERE full_name <> 'Sky Towner'GROUP BY ageHAVING COUNT(*) = 1;
+------+----------+| age | COUNT(*) |+------+----------+| 19 | 1 || 18 | 1 || 16 | 1 || 17 | 1 |+------+----------+
This time we have 4 records returned as 'Sky Towner'
is filtered out by the WHERE
clause before we perform grouping. Therefore, of the records that were aggregated / grouped, 'Benjamin Town'
was the only 17
year old, hence the HAVING
clause was fulfilled and age 17
was returned.