Introduksjon til SQL HAVING-ledd

Det helt grunnleggende spørsmålet som kommer inn i tankene er hva er denne HAVING-klausulen? Vel, HAVING-leddet brukes til å filtrere ut resultatene fra en SQL-spørring med samlede funksjoner. For å forstå på vanlig engelsk er det kommandoen for SQL-parseren "Hey SQL, fra kundedatatabellen, hent meg navnene på land som har mer enn 1 million kunder."

Vent, det er det WHERE-klausulen gjør, ikke sant? Ja, det er veldig likt hvordan WHERE-klausulen fungerer, men med en liten forskjell. WHERE-leddet fungerer ikke med samlede funksjoner.

Bare for å gjemme litt om samlede funksjoner, er dette funksjoner som tar flere rader som input og gir en mer betydelig bearbeidet utgang. Noen få eksempler er Count (), Sum (), Min (), Max (), Gjennomsnitt () etc.

Hvorfor HAVE og ikke HVOR?

Vi ser at HAVING og WHERE klausuler utfører en veldig lignende oppgave for å filtrere ut resultatene. Hva var da behovet for HAVING-klausulen? Hvorfor kunne ikke WHERE-leddet brukes med samlede funksjoner?

For å svare på dette, må vi forstå hvordan SQL-motoren behandler de to ledningene. FRA-leddet i hver SQL-kommando forteller motoren hvor du skal lese radene. Dataene lagres på disken og hentes inn i minnet for behandling. Når radene leses en etter en fra disken til minnet, blir de sjekket for WHERE-leddet. Radene som svikter WHERE-leddet, lastes ikke inn i minnet. Dermed blir WHERE-leddet evaluert for hver rad når de behandles av SQL-motoren.

Tvert imot, HAVING-leddet kommer inn i bildet først etter at radene er lastet inn i minnet. Når de er lagt i minnet, utfører aggregatfunksjonene oppgaven sin på radene SOM har ønsket tilstand.

Hvis vi nå skulle sette en WHERE-klausul med den samlede funksjonen som avg (), ville dette forvirre SQL-motoren om vi vil inkludere raden for beregning av gjennomsnittet eller ikke. I hovedsak vil vi be motoren om ikke å lese raden, siden den ikke passerte avg () -kriteriene i WHERE-leddet. Men hei, for å avgjøre om det passerte eller mislyktes avg () beregningskriteriene, må raden leses inn i minnet. En dødstilstand.

Syntaksen

SELECT
FROM


HVOR - valgfritt
GROUP BY - grupperer radene for å bruke samlet funksjon
HAVING - samlet funksjon i tilstanden
REKKEFØLGE ETTER ; - definere sorteringsrekkefølgen, valgfritt

Merk - GROUP BY-ledd er påkrevd med HAVING-klausulen. Dette er fordi Having clause trenger en gruppe data for å bruke en samlet funksjon og filtrere ut resultatene.

Hvordan HAVING-klausulen fungerer?

La oss forstå hvordan HAVING-leddet fungerer i SQL.

HAVING-leddet er alltid ledsaget av GROUP BY-klausulen. GROUP BY-leddet grupperer dataene som samsvarer med et bestemt kriterium. Den har tre faser - dele, bruke og kombinere. Den delte fasen deler radene i grupper. Brukfasen bruker noen samlede funksjoner på datagruppene. Den kombinerte fasen gir et enkelt resultat ved å kombinere gruppene med det samlede funksjonsresultatet.

Nå som gruppene er dannet, kommer HAVING-klausulen inn i bildet. HAVING-leddet filtrerer deretter ut gruppene som ikke tilfredsstiller den gitte betingelse.

SELECT Col_A, avg(Col_B) as Col_B
FROM MyTable
GROUP BY Col_A
HAVING avg(Col_B)>30

I eksemplet over ser vi altså at tabellen først er delt opp i tre grupper basert på kolonnen Col_A. Aggregatfunksjonen for å beregne gjennomsnittet av Col_B-verdier blir deretter brukt på gruppene. Dette resulterer i en enkelt rad for hver gruppe. Radene blir deretter kombinert og filtrert basert på tilstanden i HAVING-leddet.

Eksempel

La oss se på et ekte eksempel. Tenk på at vi har følgende tabell over kunder og ordrene de har lagt inn hos oss.

Kunde IDKundenavnByLand
1Anja DamianBerlinTyskland
2Denny CockettMéxico DFMexico
3Eleanor CalnanMéxico DFMexico
4Albertha AlburyLondonStorbritannia
5Latisha NembhardLuleåSverige
6Madalene BingMannheimTyskland
7Rebecka BeegleStrasbourgFrankrike
8Rosy TippieMadridSpania
9Audie KhanMarseilleFrankrike
10Hildegard BurrowesTsawassenCanada
11Cordell DutrembleLondonStorbritannia
12Nora ReynaBuenos AiresArgentina
1. 3Ursula LaforestMéxico DFMexico
14Claudie NeelBernSveits
15Portia YeeSão PauloBrasil
16Angila SegarraLondonStorbritannia
17Lise WexlerAachenTyskland
18Ned MendivilNantesFrankrike
19Sara VidaurriLondonStorbritannia
20Tayna NavinGrazØsterrike
21Pura RaySão PauloBrasil
22Erika ByardMadridSpania
23Jimmie LukeLilleFrankrike
24Shayla ByingtonBräckeSverige
25Christiana BodenMünchenTyskland
26Irina NittaNantesFrankrike
27Bryanna AllsTorinoItalia
28Norah PickenLisboaPortugal
29Moriah StwartBarcelonaSpania
30Idella HarriottSevillaSpania
Bestillings IDKunde IDBestillingsdato
102541411-07-1996
102582017-07-1996
102591. 318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
10278512-08-1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
10297704-09-1996
103033011-09-1996
10308218-09-1996
103111820-09-1996
10326810-10-1996
103272411-10-1996
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
103472106-11-1996
103512011-11-1996
103522812-11-1996
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
103701403-12-1996
103782410-12-1996
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
104001901-01-1997
104022002-01-1997
104032003-01-1997
104082308-01-1997
104101010-01-1997
104111010-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342403-02-1997
104351604-02-1997
10436705-02-1997
104422011-02-1997

Nå vil vi vite kunder fra hvilke land som har lagt sammen totalt 5 eller flere bestillinger hos oss. Det kan være en enkelt kunde som plasserer mer enn 5 ordrer eller 5 kunder som plasserer en ordre hver.

For å oppnå dette, må vi gjøre det

Trinn 1 : Bli med på de to tabellene

Trinn 2: Gruppere kundene basert på landene deres

Trinn 3: Telle antall ordrer for hver gruppe

Trinn 4: Filtrer resultatene for 5 eller flere bestillinger

La oss formulere kommandoen:

SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC

Her er resultatene:

LandNumberOfOrders
Østerrike10
Frankrike9
Sverige7
Tyskland6
Storbritannia6

Konklusjon - SQL HAVING Clause

Dermed har vi sett hva formålet med HAVING-leddet er, og hvordan fungerer det. Det er viktig å forstå det grunnleggende arbeidet, ellers kan du ende opp med å bli forvirret over hvorfor HAVING-leddet ikke gir de ønskede resultatene. Fortsett å spille med forskjellige bord og sammenføyninger og kombinasjoner sammen med HAVING-leddet.

Anbefalte artikler

Dette er en guide til SQL HAVING-klausulen. Her diskuterer vi arbeidet med HAVING-leddet i SQL og eksempel med den følgende tabellen over kunder. Du kan også gå gjennom andre foreslåtte artikler -

  1. SQL Sett inn spørring
  2. Fremmed nøkkel i SQL
  3. Tydelige nøkkelord i SQL
  4. SQL Views
  5. Topp 6 spørringseksempler på indre sammenheng i Oracle