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.