Having (SQL)

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

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]