Having (SQL)
A HAVING
clause in SQL specifies that an SQL SELECT
statement must only return rows where aggregate values meet the specified conditions.
HAVING
and WHERE
are often confused by beginners, but they serve different purposes. WHERE
is taken into account at an earlier stage of a query execution, filtering the rows read from the tables. If a query contains GROUP BY
, data from the tables are grouped and aggregated. After the aggregating operation, HAVING
is applied, filtering out the rows that don't match the specified conditions. Therefore, WHERE
applies to data read from tables, and HAVING
should only apply to aggregated data, which are not known in the initial stage of a query.
To view the present condition formed by the GROUP BY
clause, the HAVING
clause is used.
Examples
To return a list of department IDs whose total sales exceeded $1000 on the date of January 1, 2000, along with the sum of their sales on that date:
SELECT DeptID, SUM(SaleAmount)
FROM Sales
WHERE SaleDate = '01-Jan-2000'
GROUP BY DeptID
HAVING SUM(SaleAmount) > 1000
Referring to the sample tables in the Join example, the following query will return the list of departments which have more than 1 employee:
SELECT DepartmentName, COUNT(*)
FROM Employee
JOIN Department ON Employee.DepartmentID = Department.DepartmentID
GROUP BY DepartmentName
HAVING COUNT(*)>1;
HAVING
is convenient, but not necessary. Code equivalent to the example above, but without using HAVING
, might look like:
SELECT * FROM (
SELECT DepartmentName AS deptNam, COUNT(*) AS empCnt
FROM Employee AS emp
JOIN Department AS dept ON emp.DepartmentID = dept.DepartmentID
GROUP BY deptNam
) AS grp
WHERE grp.empCnt > 1;