Having (SQL)

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

Bruk[rediger | rediger kilde]

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[rediger | rediger kilde]

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[rediger | rediger kilde]