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
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 | UK |
5 | Latisha Nembhard | Luleå | Sverige |
6 | Madalene Bing | Mannheim | Tyskland |
7 | Rebecka Beegle | Strasbourg | Frankrig |
8 | Rosy Tippie | Madrid | Spanien |
9 | Audie Khan | Marseille | Frankrig |
10 | Hildegard Burrowes | Tsawassen | Canada |
11 | Cordell Dutremble | London | UK |
12 | Nora Reyna | Buenos Aires | Argentina |
13 | Ursula Laforest | México DF | Mexico |
14 | Claudie Neel | Bern | Schweiz |
15 | Portia Yee | Sao Paulo | Brasilien |
16 | Angila Segarra | London | UK |
17 | Lise Wexler | Aachen | Tyskland |
18 | Ned Mendivil | Nantes | Frankrig |
19 | Sara Vidaurri | London | UK |
20 | Tayna Navin | Graz | Østrig |
21 | Pura Ray | Sao Paulo | Brasilien |
22 | Erika Byard | Madrid | Spanien |
23 | Jimmie Luke | Lille | Frankrig |
24 | Shayla Byington | Bräcke | Sverige |
25 | Christiana Boden | München | Tyskland |
26 | Irina Nitta | Nantes | Frankrig |
27 | Bryanna Alls | Torino | Italien |
28 | Norah Picken | Lisboa | Portugal |
29 | Moriah Stwart | Barcelona | Spanien |
30 | Idella Harriott | Sevilla | Spanien |
Ordre ID | Kunde ID | Bestillingsdato |
10254 | 14 | 1996/11/07 |
10258 | 20 | 17-07-1996 |
10259 | 13 | 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 | 1996/12/08 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 1996/04/09 |
10303 | 30 | 1996/11/09 |
10308 | 2 | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 1996/10/10 |
10327 | 24 | 1996/11/10 |
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 | 1996/06/11 |
10351 | 20 | 1996/11/11 |
10352 | 28 | 1996/12/11 |
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 | 1996/03/12 |
10378 | 24 | 1996/10/12 |
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 | 1997/01/01 |
10402 | 20 | 1997/02/01 |
10403 | 20 | 1997/03/01 |
10408 | 23 | 1997/08/01 |
10410 | 10 | 1997/10/01 |
10411 | 10 | 1997/10/01 |
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 | 1997/03/02 |
10435 | 16 | 1997/04/02 |
10436 | 7 | 1997/05/02 |
10442 | 20 | 1997/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:
Land | NumberOfOrders |
Østrig | 10 |
Frankrig | 9 |
Sverige | 7 |
Tyskland | 6 |
UK | 6 |
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 -
- SQL Indsæt forespørgsel
- Fremmed nøgle i SQL
- Tydeligt nøgleord i SQL
- SQL Views
- Top 6 forespørgseksempler på indre samling i Oracle