Uvod v klavzulo SQL HAVING
Zelo osnovno vprašanje, ki prihaja na misel, je, kaj je to HAVING klavzula? No, določba HAVING se uporablja za filtriranje rezultatov iz poizvedbe SQL s skupnimi funkcijami. Če želite razumeti v navadni angleščini, ukažemo SQL razčlenjevalcu "Hej SQL, iz naše tabele s podatki o strankah, donesite mi imena držav, v katerih je več kot 1 milijon strank".
Počakajte, to počne KLJUČNA Klavzula, kajne? Da, to je zelo podobno delovanju klavzule WHERE, vendar z majhno razliko. Stavka WHERE ne deluje s skupnimi funkcijami.
Zdaj, če povzamem nekaj o skupnih funkcijah, so to funkcije, ki sprejmejo več vrstic kot vhod in dajo bistveno bolj obdelani izhod. Nekaj primerov so grof (), vsota (), min (), maks (), povprek () itd.
Zakaj LAHKO in ne KJE?
Vidimo, da stavki HAVING in WHERE opravljajo zelo podobno nalogo za filtriranje rezultatov. Potem je bila torej potrebna klavzula HAVING? Zakaj stavka WHERE ni bilo mogoče uporabiti s skupnimi funkcijami?
Da bi odgovorili na to vprašanje, bi morali razumeti, kako motor SQL obravnava obe določbi. Klavzula FROM v vsakem ukazu SQL pove motorju, od kod brati vrstice. Podatki se shranijo na disk in se v obdelavo shranijo v pomnilnik. Ker se vrstice berejo ena za drugo iz diska v pomnilnik, se preverijo, kje je WHERE. Vrstice, ki odpovejo člen WHERE, se ne naložijo v pomnilnik. Tako se klavzula WHERE ovrednoti za vsako vrstico, ko jih obdela SQL motor.
Nasprotno, klavzula HAVING pride v sliko šele po nalaganju vrstic v pomnilnik. Ko se naložijo v pomnilnik, agregatne funkcije opravijo svojo nalogo v vrsticah OB VSEBINI želenega stanja.
Zdaj, če bi postavili klavzulo WHERE s funkcijo združevanja, kot je avg (), bi to zmedlo motorja SQL glede vključitve vrstice za izračun povprečja ali ne. V bistvu bi ukazali motorju, naj ne bere vrstice, saj ni prestal meril avg () v klavzuli WHERE. Ampak hej, če želite določiti, ali je merila za avg () prešlo ali ne, je treba vrstico prebrati v pomnilniku. Stanje v slepi ulici.
Sintaksa
SELECT
FROM
Identifikacijska številka stranke | Ime stranke | Mesto | Država |
1 | Anja Damian | Berlin | Nemčija |
2 | Denny Cockett | México DF | Mehika |
3 | Eleanor Calnan | México DF | Mehika |
4 | Albertha Albury | London | UK |
5 | Latisha Nembhard | Luleå | Švedska |
6 | Madalene Bing | Mannheim | Nemčija |
7 | Rebecka Beegle | Strasbourgu | Francija |
8 | Rosy Tippie | Madrid | Španija |
9 | Audie Khan | Marseille | Francija |
10 | Hildegard Burrowes | Tsawassen | Kanada |
11 | Cordell Dutremble | London | UK |
12 | Nora Reyna | Buenos Aires | Argentina |
13 | Ursula Laforest | México DF | Mehika |
14 | Claudie Neel | Bern | Švica |
15 | Portia Yee | Sao Paulo | Brazilija |
16 | Angila Segarra | London | UK |
17 | Lise Wexler | Aachen | Nemčija |
18 | Ned Mendivil | Nantes | Francija |
19 | Sara Vidaurri | London | UK |
20 | Tayna Navin | Gradec | Avstrija |
21 | Pura Ray | Sao Paulo | Brazilija |
22 | Erika Byard | Madrid | Španija |
23 | Jimmie Luke | Lille | Francija |
24 | Shayla Byington | Bräcke | Švedska |
25 | Christiana Boden | München | Nemčija |
26 | Irina Nitta | Nantes | Francija |
27 | Bryanna Alls | Torino | Italija |
28 | Norah Picken | Lizboa | Portugalska |
29 | Moriah Stwart | Barcelona | Španija |
30 | Idella Harriott | Sevilla | Španija |
Številka naročila | Identifikacijska številka stranke | Datum naročila |
10254 | 14 | 11.7.1996 |
10258 | 20 | 17.7.1996 |
10259 | 13 | 18.7.1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24.7.1996 |
10265 | 7 | 25-07-1996 |
10267 | 25 | 29.7.1996 |
10278 | 5 | 12. 8. 1996 |
10280 | 5 | 14.8.1996 |
10289 | 11 | 26. 8. 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 | 1.1.1997 |
10402 | 20 | 2.1.1997 |
10403 | 20 | 01.01.1997 |
10408 | 23 | 8.1.1997 |
10410 | 10 | 10.1.1997 |
10411 | 10 | 10.1.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 | 02.02.1997 |
10435 | 16 | 02.02.1997 |
10436 | 7 | 02.02.1997 |
10442 | 20 | 11-02-1997 |
Zdaj želimo vedeti, katere stranke iz katerih držav so pri nas oddale skupno 5 ali več naročil. Lahko je ena stranka, ki odda več kot 5 naročil, ali 5 strank, ki oddajo vsako naročilo.
Da bi to dosegli, bi morali
1. korak : Pridružite se dvema tabelama
2. korak: združite stranke glede na njihove države
3. korak: preštejte število naročil za vsako skupino
4. korak: Filtrirajte rezultate za 5 ali več naročil
Formulirajmo ukaz:
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
Tu so rezultati:
Država | NumberOfOrders |
Avstrija | 10 |
Francija | 9 |
Švedska | 7 |
Nemčija | 6 |
UK | 6 |
Zaključek - Klavzula o SQL HAVING
Tako smo videli, kakšen je namen klavzule HAVING in kako deluje. Pomembno je razumeti osnovno delovanje ali drugače se lahko zmedete, zakaj klavzula HAVING ne daje želenih rezultatov. Nadaljujte z igranjem različnih tabel ter združevanj in kombinacij, skupaj s klavzulo HAVING.
Priporočeni članki
To je vodnik po klavzuli SQL HAVING. Tukaj razpravljamo o delu klavzule HAVING v SQL in primeru z naslednjo tabelo kupcev. Ogledate si lahko tudi druge naše predlagane članke -
- Poizvedba za vstavljanje SQL
- Tuji ključ v SQL
- Ločena ključna beseda v SQL
- Pogledi SQL
- Najboljših 6 poizvedbenih primerov notranje pridruži Oracle