Kildeløs: Denne artikkelen mangler kildehenvisninger, og opplysningene i den kan dermed være vanskelige å verifisere. Kildeløst materiale kan bli fjernet. |
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.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.
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;