Introduktion til SQL HAVING-klausul

Det meget grundlæggende spørgsmål, der kommer ind i sindet, er, hvad er denne HAVING-klausul? Nå, HAVING-klausulen bruges til at filtrere resultaterne fra en SQL-forespørgsel med samlede funktioner. For at forstå på almindeligt engelsk kommanderer det SQL-parseren 'Hey SQL fra vores kundedatatabel, hent mig navnene på lande, der har mere end 1 million kunder'.

Vent, det er hvad WHERE-klausulen gør, ikke? Ja, det ligner meget, hvordan WHERE-klausulen fungerer, men med en lille forskel. WHERE-klausulen fungerer ikke med samlede funktioner.

Nu, bare for at sammenfatte lidt om samlede funktioner, er dette funktioner, der tager flere rækker som input og giver en mere markant behandlet output. Et par eksempler er Count (), Sum (), Min (), Max (), Gns () osv.

Hvorfor HAVE og ikke HVOR?

Vi ser, at klausuler HAVING og HVOR udfører en meget lignende opgave for at filtrere resultaterne. Hvad var så behovet for HAVING-klausulen? Hvorfor kunne WHERE-klausulen ikke bruges med samlede funktioner?

For at besvare dette bliver vi nødt til at forstå, hvordan SQL-motoren behandler de to klausuler. FRA-klausulen i hver SQL-kommando fortæller motoren, hvorfra de skal læse rækkerne. Dataene gemmes på disken og hentes i hukommelsen til behandling. Når rækkerne læses en efter en fra disken til hukommelsen, kontrolleres de for WHERE-leddet. Rækkerne, der svigter WHERE-leddet, indlæses ikke i hukommelsen. WHERE-bestemmelsen evalueres således for hver række, når de behandles af SQL-motoren.

Tværtimod, HAVING-klausulen kommer først i billedet, efter at rækkerne er lagt i hukommelsen. Når de er lagt i hukommelsen, udfører de samlede funktioner deres opgave på rækkerne, der har den ønskede tilstand.

Hvis vi nu skulle placere en WHERE-klausul med den samlede funktion såsom avg (), ville dette forvirre SQL-motoren om, hvorvidt rækken til beregning af gennemsnittet skal inkluderes eller ej. I det væsentlige beder vi motoren om ikke at læse rækken, da den ikke overholdt gennemsnittet () -kriterierne i WHERE-bestemmelsen. Men hey, for at bestemme, om det har bestået eller mislykket gennemsnittet () beregningskriterier, skal ræden læses ind i hukommelsen. En tilstand af dødvande.

Syntaks

SELECT
FROM


HVOR - valgfrit
GROUP BY - grupperer rækkerne for at anvende samlet funktion
HAVING - samlet funktion i tilstanden
BESTILLING AF; - definere sorteringsrækkefølgen, valgfri

Bemærk - GROUP BY-klausul kræves med HAVING-klausulen. Dette skyldes, at Have-klausul har brug for en gruppe data for at anvende en samlet funktion og filtrere resultaterne.

Hvordan HAVING-klausul fungerer?

Lad os forstå, hvordan HAVING-klausulen fungerer i SQL.

HAVING-klausulen ledsages altid af GROUP BY-klausulen. GROUP BY-klausulen grupperer de data, der matcher et bestemt kriterium. Det har tre faser - delt, anvendt og kombiner. Opdelingsfasen deler rækkerne i grupper. Anvendelsesfasen anvender nogle samlede funktioner på datagrupperne. Den kombinerede fase producerer et enkelt resultat ved at kombinere grupperne med det samlede funktionsresultat.

Nu hvor grupperne er dannet, kommer HAVING-klausulen ind i billedet. HAVING-bestemmelsen filtrerer derefter de grupper, der ikke opfylder den givne betingelse.

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

I eksemplet ovenfor ser vi således, at tabellen først er opdelt i tre grupper baseret på kolonnen Col_A. Den samlede funktion til beregning af gennemsnittet af Col_B-værdier anvendes derefter til grupperne. Dette resulterer i en enkelt række for hver gruppe. Rækkerne kombineres og filtreres derefter på baggrund af betingelsen i HAVING-bestemmelsen.

Eksempel

Lad os nu se på et ægte eksempel. Overvej, at vi har følgende tabel med kunder og de ordrer, de har placeret hos os.

Kunde IDKundenavnbyLand
1Anja DamianBerlinTyskland
2Denny CockettMéxico DFMexico
3Eleanor CalnanMéxico DFMexico
4Albertha AlburyLondonUK
5Latisha NembhardLuleåSverige
6Madalene BingMannheimTyskland
7Rebecka BeegleStrasbourgFrankrig
8Rosy TippieMadridSpanien
9Audie KhanMarseilleFrankrig
10Hildegard BurrowesTsawassenCanada
11Cordell DutrembleLondonUK
12Nora ReynaBuenos AiresArgentina
13Ursula LaforestMéxico DFMexico
14Claudie NeelBernSchweiz
15Portia YeeSao PauloBrasilien
16Angila SegarraLondonUK
17Lise WexlerAachenTyskland
18Ned MendivilNantesFrankrig
19Sara VidaurriLondonUK
20Tayna NavinGrazØstrig
21Pura RaySao PauloBrasilien
22Erika ByardMadridSpanien
23Jimmie LukeLilleFrankrig
24Shayla ByingtonBräckeSverige
25Christiana BodenMünchenTyskland
26Irina NittaNantesFrankrig
27Bryanna AllsTorinoItalien
28Norah PickenLisboaPortugal
29Moriah StwartBarcelonaSpanien
30Idella HarriottSevillaSpanien
Ordre IDKunde IDBestillingsdato
10254141996/11/07
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
1027851996/12/08
10280514-08-1996
102891126-08-1996
102901527-08-1996
1029771996/04/09
10303301996/11/09
10308218-09-1996
103111820-09-1996
1032681996/10/10
10327241996/11/10
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
10347211996/06/11
10351201996/11/11
10352281996/12/11
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
10370141996/03/12
10378241996/10/12
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
10400191997/01/01
10402201997/02/01
10403201997/03/01
10408231997/08/01
10410101997/10/01
10411101997/10/01
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
10434241997/03/02
10435161997/04/02
1043671997/05/02
10442201997/11/02

Nu vil vi gerne vide, hvilke kunder i hvilke lande der i alt har bestilt 5 eller flere ordrer hos os. Det kan være en enkelt kunde, der foretager mere end 5 ordrer eller 5 kunder, der afgiver en ordre hver.

For at opnå dette er vi nødt til at gøre det

Trin 1 : Deltag i de to tabeller

Trin 2: Gruppér kunderne baseret på deres lande

Trin 3: Tæl antallet af ordrer for hver gruppe

Trin 4: Filtrer resultaterne for 5 eller flere ordrer

Lad os 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 resultaterne:

LandNumberOfOrders
Østrig10
Frankrig9
Sverige7
Tyskland6
UK6

Konklusion - SQL HAVING-klausul

Vi har således set, hvad formålet med HAVING-klausulen er, og hvordan fungerer det. Det er vigtigt at forstå det grundlæggende arbejde, ellers kan du ende med at blive forvirret over, hvorfor HAVING-klausulen ikke giver de ønskede resultater. Fortsæt med at spille med forskellige borde og sammenføjninger og kombinationer sammen med HAVING-klausulen.

Anbefalede artikler

Dette er en guide til SQL HAVING-klausulen. Her diskuterer vi arbejdet med HAVING-klausulen i SQL og eksemplet med den følgende tabel med kunder. Du kan også gennemgå vores andre foreslåede artikler -

  1. SQL Indsæt forespørgsel
  2. Fremmed nøgle i SQL
  3. Tydeligt nøgleord i SQL
  4. SQL Views
  5. Top 6 forespørgseksempler på indre samling i Oracle