Att ha (SQL)
En HAVING-
sats i SQL anger att en SQL SELECT
-sats endast får returnera rader där aggregerade värden uppfyller de angivna villkoren .
HAVING
och WHERE
förväxlas ofta av nybörjare, men de tjänar olika syften. WHERE
beaktas i ett tidigare skede av en frågekörning, filtrering av raderna som läses från tabellerna. Om en fråga innehåller GROUP BY
, grupperas och aggregeras rader från tabellerna. Efter aggregeringsoperationen tillämpas HAVING , som filtrerar bort de rader som inte matchar de angivna villkoren.
Därför gäller WHERE
för data som läses från tabeller, och HAVING
bör endast gälla för aggregerad data, som inte är känd i det inledande skedet av en fråga.
För att se det nuvarande villkoret som bildas av GROUP BY-
satsen, används HAVING -satsen.
[ förtydligande behövs ]
Exempel
Så här returnerar du en lista över avdelnings-ID vars totala försäljning översteg 1 000 USD den 1 januari 2000, tillsammans med summan av deras försäljning på det datumet:
VÄLJ DeptID , SUMMA ( SaleAmount ) FROM Sales WHERE SaleDate = '01-Jan-2000' GRUPP EFTER Avd. ID ATT HAR SUMMA ( SaleAmount ) > 1000
Med hänvisning till exempeltabellerna i Join -exemplet kommer följande fråga att returnera listan över avdelningar som har mer än 1 anställd:
VÄLJ Avdelningsnamn , ANTAL ( * ) FRÅN Anställd JOIN Avdelning PÅ Anställd . Avdelnings-ID = Avdelning . Avdelnings-ID GRUPPER EFTER Avdelningsnamn HAR ANTAL ( * ) > 1 ;
HA
är bekvämt, men inte nödvändigt. Kod som motsvarar exemplet ovan, men utan att använda HAVING
, kan se ut så här:
VÄLJ * FRÅN ( VÄLJ Avdelningsnamn SOM avd.Nam , ANTAL ( * ) SOM anställning FRÅN Anställd SOM anställd JOIN Avdelning SOM avd . PÅ anställd Avdelnings -ID = avd . Avdelnings - ID GRUPPER EFTER avd.Nam ) SOM grp WHERE grp . empCount > 1 ;