Having (SQL)

Category:Articles with short descriptionCategory:Short description matches Wikidata

Category:Use American English from February 2024Category:All Wikipedia articles written in American English Category:Use mdy dates from February 2024

Category:Articles needing additional references from February 2024Category:All articles needing additional references

A HAVING clause in SQL specifies that an SQL SELECT statement must only return rows where aggregate values meet the specified conditions.[1]:125–127

Use

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, rows 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 isn't known in the initial stage of a query.

To view the present condition formed by the GROUP BY clause, the HAVING clause is used.Category:Wikipedia articles needing clarification from September 2020[clarification needed]

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 = '2000-01-01'
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 empCount
    FROM Employee AS emp
    JOIN Department AS dept ON emp.DepartmentID = dept.DepartmentID
    GROUP BY deptNam
) AS grp
WHERE grp.empCount > 1;

References

  1. PostgreSQL 16.1 Documentation (PDF). The PostgreSQL Global Development Group. 2023. Retrieved February 8, 2024.
Category:SQL keywords Category:Articles with example SQL code
Category:All Wikipedia articles written in American English Category:All articles needing additional references Category:Articles needing additional references from February 2024 Category:Articles with example SQL code Category:Articles with short description Category:SQL keywords Category:Short description matches Wikidata Category:Use American English from February 2024 Category:Use mdy dates from February 2024 Category:Webarchive template wayback links Category:Wikipedia articles needing clarification from September 2020