En HAVING-klausul i SQL angir at et SQL SELECT-uttrykk bare skal returnere rader der samlede verdier oppfyller de angitte betingelser.

Bruk HAVING og WHERE forveksles ofte av nybegynnere, men de har forskjellige formål.

WHERE tas i betraktning på et tidligere stadium av kjøringen av en spørring, og filtrerer radene som leses fra tabellene. Hvis en spørring inneholder GROUP BY, blir rader fra tabellene grupperte og samlet. Etter aggregeringsoperasjonen påføres HAVING, og filtrerer ut radene som ikke samsvarer med de angitte betingelsene.

Derfor gjelder WHERE for data som leses fra tabeller, mens HAVING bare bør gjelde for aggregerte data som ikke er kjent i den innledende fasen av en spørring.

For å se den nåværende tilstanden dannet av en GROUP BY-klausul må HAVING-klausulen brukes. 

Eksempler For å returnere en liste over avdelings-ID-er som solgte for mer enn $1000 på datoen 2020-01-01, sammen med summen av salget på den datoen, kan man skrive følgende spørring:

SELECT DeptID, SUM(SaleAmount) FROM Sales WHERE SaleDate = '2000-01-01' GROUP BY DeptID HAVING SUM(SaleAmount) > 1000

Følgende spørring vil returnere en liste over avdelinger som har mer enn 1 ansatt:

SELECT DepartmentName, COUNT(*) FROM Employee JOIN Department ON Employee.DepartmentID = Department.DepartmentID GROUP BY DepartmentName HAVING COUNT(*) > 1;

HAVING er praktisk, men ikke nødvendig. Et resultat tilsvarende eksempelet over, men uten å bruke HAVING, kan fås mes følgende kode:

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;

Eksterne lenker The HAVING and GROUP BY SQL clauses SQL Aggregate Functions - W3Schools

Kategori:Databaser