Introduktion till SQL HAVING-klausul

Den mycket grundläggande frågan som kommer in i sinnet är vad är denna HAVING-klausul? Tja, HAVING-klausulen används för att filtrera bort resultaten från en SQL-fråga med aggregerade funktioner. För att förstå på vanligt engelska, är det kommandot SQL-parsern "Hej SQL, från vår kunddatatabell, hämta mig namnen på länder som har mer än 1 miljon kunder".

Vänta, det är vad WHERE-klausulen gör, eller hur? Ja, det är väldigt likt hur WHERE-klausulen fungerar men med en liten skillnad. WHERE-klausulen fungerar inte med aggregerade funktioner.

Nu, bara för att sammanfatta lite om aggregerade funktioner, det här är funktioner som tar flera rader som ingång och ger en mer signifikant bearbetad utgång. Några exempel är Count (), Sum (), Min (), Max (), Avg () etc.

Varför HAVA och inte VAR?

Vi ser att HAVING och WHERE-klausuler utför en mycket liknande uppgift för att filtrera bort resultaten. Vad var då behovet av HAVING-klausulen? Varför kunde inte WHERE-klausulen användas med aggregerade funktioner?

För att svara på detta måste vi förstå hur SQL-motorn behandlar de två klausulerna. FRA-klausulen i varje SQL-kommando säger motorn varifrån den ska läsas raderna. Data lagras på disken och hämtas i minnet för bearbetning. När raderna läses en och en från skivan till minnet, kontrolleras de för WHERE-klausulen. Raderna som misslyckas med WHERE-klausulen laddas inte i minnet. Således utvärderas WHERE-klausulen för varje rad när de behandlas av SQL-motorn.

Tvärtom, HAVING-klausulen kommer in i bilden först efter att raderna har laddats i minnet. När de har laddats in i minnet utför de aggregerade funktionerna sin uppgift på raderna med önskat tillstånd.

Om vi ​​nu skulle sätta en WHERE-klausul med den sammanlagda funktionen som avg () skulle detta förvirra SQL-motorn om den skulle inkludera raden för att beräkna medelvärdet eller inte. I grund och botten skulle vi beordra motorn att inte läsa raden eftersom den inte passade kriterierna för avg () i WHERE-klausulen. Men hej, för att avgöra om det passerade eller misslyckades med beräkningskriterierna för avg () måste raden läsas in i minnet. Ett tillstånd av dödläge.

Syntaxen

SELECT
FROM


VAR - valfritt
GROUP BY - grupperar raderna för att tillämpa aggregerad funktion
HAVING - aggregerad funktion i tillståndet
SORTERA EFTER ; - definiera sorteringsordningen, valfritt

Obs - GROUP BY-klausul krävs med HAVING-klausulen. Detta beror på att Having-klausulen behöver en grupp data för att tillämpa en sammanlagd funktion och filtrera bort resultaten.

Hur HAVING-klausulen fungerar?

Låt oss förstå hur HAVING-klausulen fungerar i SQL.

HAVING-klausulen åtföljs alltid av GROUP BY-klausulen. GROUP BY-klausulen grupperar data som matchar ett visst kriterium. Den har tre faser - dela, applicera och kombinera. Delningsfasen delar raderna i grupper. Tillämpningsfasen tillämpar vissa aggregerade funktioner på datagrupperna. Den kombinerade fasen producerar ett enda resultat genom att kombinera grupperna med det sammanlagda funktionsresultatet.

Nu när grupperna bildas kommer HAVING-klausulen in i bilden. HAVING-klausulen filtrerar sedan bort de grupper som inte uppfyller det givna villkoret.

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

I exemplet ovan ser vi således att tabellen först delas upp i tre grupper baserat på kolumnen Col_A. Den sammanlagda funktionen för att beräkna medelvärdet för Col_B-värden tillämpas sedan på grupperna. Detta resulterar i en enda rad för varje grupp. Raderna kombineras sedan och filtreras baserat på villkoret i HAVING-klausulen.

Exempel

Låt oss nu titta på ett verkligt exempel. Tänk på att vi har följande tabell över kunder och de beställningar som de har gjort hos oss.

KundnummerKöparens namnStadLand
1Anja DamianBerlinTyskland
2Denny CockettMéxico DFmexico
3Eleanor CalnanMéxico DFmexico
4Albertha AlburyLondonStorbritannien
5Latisha NembhardLuleåSverige
6Madalene BingMannheimTyskland
7Rebecka BeegleStrasbourgFrankrike
8Rosy TippiemadridSpanien
9Audie KhanMarseilleFrankrike
10Hildegard BurrowesTsawassenkanada
11Cordell DutrembleLondonStorbritannien
12Nora ReynaBuenos Airesargentina
13Ursula LaforestMéxico DFmexico
14Claudie NeelBernschweiz
15Portia YeeSao PauloBrasilien
16Angila SegarraLondonStorbritannien
17Lise WexlerAachenTyskland
18Ned MendivilNantesFrankrike
19Sara VidaurriLondonStorbritannien
20Tayna NavinGrazösterrike
21Pura RaySao PauloBrasilien
22Erika ByardmadridSpanien
23Jimmie LukeLilleFrankrike
24Shayla ByingtonBräckeSverige
25Christiana BodenMünchenTyskland
26Irina NittaNantesFrankrike
27Bryanna AllsTorinoItalien
28Norah PickenLisboaportugal
29Moriah StwartBarcelonaSpanien
30Idella HarriottSevillaSpanien
OrderIDKundnummerOrderdatum
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 vill vi veta kunder i vilka länder som har gjort totalt 5 eller fler beställningar hos oss. Det kan vara en enda kund som gör mer än 5 beställningar eller 5 kunder som gör en beställning vardera.

För att uppnå detta skulle vi behöva

Steg 1 : Gå med i de två borden

Steg 2: Gruppera kunderna baserat på deras länder

Steg 3: Räkna antalet beställningar för varje grupp

Steg 4: Filtrera resultaten för 5 eller fler beställningar

Låt oss formulera kommandot:

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

Här är resultaten:

LandNumberOfOrders
österrike10
Frankrike9
Sverige7
Tyskland6
Storbritannien6

Slutsats - SQL HAVING-klausul

Således har vi sett vad syftet med HAVING-klausulen är och hur fungerar det. Det är viktigt att förstå det grundläggande arbetet, annars kan du bli förvirrad över varför HAVING-klausulen inte ger de önskade resultaten. Fortsätt spela med olika bord och sammanfogningar och kombinationer tillsammans med HAVING-klausulen.

Rekommenderade artiklar

Detta är en guide till SQL HAVING-klausulen. Här diskuterar vi hur HAVING-klausulen fungerar i SQL och exempel med följande tabell över kunder. Du kan också gå igenom våra andra föreslagna artiklar -

  1. SQL Infoga fråga
  2. Utländsk nyckel i SQL
  3. Särskilt sökord i SQL
  4. SQL Views
  5. Topp 6 förfrågan Exempel på Inre medlem i Oracle