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
Kunde ID | Kundenavn | By | Land |
1 | Anja Damian | Berlin | Tyskland |
2 | Denny Cockett | México DF | Mexico |
3 | Eleanor Calnan | México DF | Mexico |
4 | Albertha Albury | London | Storbritannia |
5 | Latisha Nembhard | Luleå | Sverige |
6 | Madalene Bing | Mannheim | Tyskland |
7 | Rebecka Beegle | Strasbourg | Frankrike |
8 | Rosy Tippie | Madrid | Spania |
9 | Audie Khan | Marseille | Frankrike |
10 | Hildegard Burrowes | Tsawassen | Canada |
11 | Cordell Dutremble | London | Storbritannia |
12 | Nora Reyna | Buenos Aires | Argentina |
1. 3 | Ursula Laforest | México DF | Mexico |
14 | Claudie Neel | Bern | Sveits |
15 | Portia Yee | São Paulo | Brasil |
16 | Angila Segarra | London | Storbritannia |
17 | Lise Wexler | Aachen | Tyskland |
18 | Ned Mendivil | Nantes | Frankrike |
19 | Sara Vidaurri | London | Storbritannia |
20 | Tayna Navin | Graz | Østerrike |
21 | Pura Ray | São Paulo | Brasil |
22 | Erika Byard | Madrid | Spania |
23 | Jimmie Luke | Lille | Frankrike |
24 | Shayla Byington | Bräcke | Sverige |
25 | Christiana Boden | München | Tyskland |
26 | Irina Nitta | Nantes | Frankrike |
27 | Bryanna Alls | Torino | Italia |
28 | Norah Picken | Lisboa | Portugal |
29 | Moriah Stwart | Barcelona | Spania |
30 | Idella Harriott | Sevilla | Spania |
Bestillings ID | Kunde ID | Bestillingsdato |
10254 | 14 | 11-07-1996 |
10258 | 20 | 17-07-1996 |
10259 | 1. 3 | 18-07-1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24-07-1996 |
10265 | 7 | 25-07-1996 |
10267 | 25 | 29-07-1996 |
10278 | 5 | 12-08-1996 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 04-09-1996 |
10303 | 30 | 11-09-1996 |
10308 | 2 | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 10-10-1996 |
10327 | 24 | 11-10-1996 |
10328 | 28 | 14-10-1996 |
10331 | 9 | 16-10-1996 |
10337 | 25 | 24-10-1996 |
10340 | 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10347 | 21 | 06-11-1996 |
10351 | 20 | 11-11-1996 |
10352 | 28 | 12-11-1996 |
10355 | 4 | 15-11-1996 |
10360 | 7 | 22-11-1996 |
10362 | 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10364 | 19 | 26-11-1996 |
10365 | 3 | 27-11-1996 |
10366 | 29 | 28-11-1996 |
10368 | 20 | 29-11-1996 |
10370 | 14 | 03-12-1996 |
10378 | 24 | 10-12-1996 |
10382 | 20 | 13-12-1996 |
10383 | 4 | 16-12-1996 |
10384 | 5 | 16-12-1996 |
10386 | 21 | 18-12-1996 |
10389 | 10 | 20-12-1996 |
10390 | 20 | 23-12-1996 |
10391 | 17 | 23-12-1996 |
10396 | 25 | 27-12-1996 |
10400 | 19 | 01-01-1997 |
10402 | 20 | 02-01-1997 |
10403 | 20 | 03-01-1997 |
10408 | 23 | 08-01-1997 |
10410 | 10 | 10-01-1997 |
10411 | 10 | 10-01-1997 |
10414 | 21 | 14-01-1997 |
10422 | 27 | 22-01-1997 |
10426 | 29 | 27-01-1997 |
10430 | 20 | 30-01-1997 |
10431 | 10 | 30-01-1997 |
10434 | 24 | 03-02-1997 |
10435 | 16 | 04-02-1997 |
10436 | 7 | 05-02-1997 |
10442 | 20 | 11-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:
Land | NumberOfOrders |
Østerrike | 10 |
Frankrike | 9 |
Sverige | 7 |
Tyskland | 6 |
Storbritannia | 6 |
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 -
- SQL Sett inn spørring
- Fremmed nøkkel i SQL
- Tydelige nøkkelord i SQL
- SQL Views
- Topp 6 spørringseksempler på indre sammenheng i Oracle