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  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 .   anställd  Avdelnings -ID   = avd   .  Avdelnings  -  ID  GRUPPER  EFTER  avd.Nam  )  SOM  grp  WHERE  grp  .  empCount  >  1  ; 

externa länkar