Å ha (SQL) - Having (SQL)
En HAVINGklausul i SQL spesifiserer at en SQL- SELECTsetning bare må returnere rader der samlede verdier oppfyller de angitte betingelsene .
HAVINGog WHEREblir ofte forvirret av nybegynnere, men de tjener forskjellige formål. WHEREblir tatt i betraktning på et tidligere stadium av en spørringskjøring, filtrerer radene som er lest fra tabellene. Hvis et spørsmål inneholder GROUP BY, er rader fra tabellene gruppert og samlet. Etter at aggregeringen HAVINGer brukt, filtreres radene ut som ikke samsvarer med de spesifiserte forholdene. Derfor WHEREgjelder for data som leses fra tabeller, og HAVINGkun skal gjelde aggregerte data, som er ikke kjent i den innledende fasen av en spørring.
For å se den nåværende tilstanden som er dannet av GROUP BYklausulen, brukes HAVINGklausulen.
Eksempler
Slik returnerer du en liste over avdelings-ID-er der det totale salget overstiger $ 1000 på datoen 1. januar 2000, sammen med summen av deres salg på den datoen:
SELECT DeptID, SUM(SaleAmount)
FROM Sales
WHERE SaleDate = '01-Jan-2000'
GROUP BY DeptID
HAVING SUM(SaleAmount) > 1000
Med henvisning til eksempeltabellene i Bli med- eksemplet , vil følgende spørsmål returnere listen 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;
HAVINGer praktisk, men ikke nødvendig. Kode som tilsvarer eksemplet ovenfor, men uten å bruke HAVING, kan se ut som:
SELECT * FROM (
SELECT DepartmentName AS deptNam, COUNT(*) AS empCnt
FROM Employee AS emp
JOIN Department AS dept ON emp.DepartmentID = dept.DepartmentID
GROUP BY deptNam
) AS grp
WHERE grp.empCnt > 1;