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


KJE - neobvezno
GROUP BY - združuje vrstice za uporabo skupne funkcije
HAVING - funkcija agregata v stanju
NAROČITE PO; - določite vrstni red razvrščanja, neobvezno

Opomba - s klavzulo HAVING je potrebna določba GROUP BY. To je zato, ker mora imeti klavzula skupino podatkov za uporabo zbirne funkcije in filtriranje rezultatov.

Kako deluje klavzula HAVING?

Dovolite nam, da razumemo delovanje klavzule HAVING v SQL.

Klavzulo HAVING vedno spremlja klavzula GROUP BY. Odstavek GROUP BY združuje podatke, ki ustrezajo določenemu kriteriju. Ima tri faze - razdeliti, nanesti in združiti. Razcepljena faza razdeli vrstice v skupine. Faza uveljavljanja uporablja nekatere zbirne funkcije na skupinah podatkov. Kombinirana faza ustvari en sam rezultat, če združuje skupine s skupnim rezultatom funkcije.

Zdaj, ko so skupine oblikovane, na sliko prihaja klavzula HAVING. Klavzula HAVING nato filtrira skupine, ki ne izpolnjujejo danega pogoja.

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

Tako v zgornjem primeru vidimo, da se tabela najprej razdeli na tri skupine na podlagi stolpca Col_A. Nato se skupinam uporabi funkcija združevanja za izračun povprečja vrednosti Col_B. Rezultat je ena sama vrstica za vsako skupino. Vrstice se nato združijo in filtrirajo glede na stanje v klavzuli HAVING.

Primer

Poglejmo si primer iz resničnega sveta. Upoštevajte, da imamo naslednjo tabelo kupcev in naročila, ki so jih oddali pri nas.

Identifikacijska številka strankeIme strankeMestoDržava
1Anja DamianBerlinNemčija
2Denny CockettMéxico DFMehika
3Eleanor CalnanMéxico DFMehika
4Albertha AlburyLondonUK
5Latisha NembhardLuleåŠvedska
6Madalene BingMannheimNemčija
7Rebecka BeegleStrasbourguFrancija
8Rosy TippieMadridŠpanija
9Audie KhanMarseilleFrancija
10Hildegard BurrowesTsawassenKanada
11Cordell DutrembleLondonUK
12Nora ReynaBuenos AiresArgentina
13Ursula LaforestMéxico DFMehika
14Claudie NeelBernŠvica
15Portia YeeSao PauloBrazilija
16Angila SegarraLondonUK
17Lise WexlerAachenNemčija
18Ned MendivilNantesFrancija
19Sara VidaurriLondonUK
20Tayna NavinGradecAvstrija
21Pura RaySao PauloBrazilija
22Erika ByardMadridŠpanija
23Jimmie LukeLilleFrancija
24Shayla ByingtonBräckeŠvedska
25Christiana BodenMünchenNemčija
26Irina NittaNantesFrancija
27Bryanna AllsTorinoItalija
28Norah PickenLizboaPortugalska
29Moriah StwartBarcelonaŠpanija
30Idella HarriottSevillaŠpanija
Številka naročilaIdentifikacijska številka strankeDatum naročila
102541411.7.1996
102582017.7.1996
102591318.7.1996
102632023-07-1996
102642424.7.1996
10265725-07-1996
102672529.7.1996
10278512. 8. 1996
10280514.8.1996
102891126. 8. 1996
102901527-08-1996
10297704-09-1996
103033011-09-1996
10308218-09-1996
103111820-09-1996
10326810-10-1996
103272411-10-1996
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
103472106-11-1996
103512011-11-1996
103522812-11-1996
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
103701403.12.1996
103782410-12-1996
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
10400191.1.1997
10402202.1.1997
104032001.01.1997
10408238.1.1997
104101010.1.1997
104111010.1.1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342402.02.1997
104351602.02.1997
10436702.02.1997
104422011-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žavaNumberOfOrders
Avstrija10
Francija9
Švedska7
Nemčija6
UK6

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 -

  1. Poizvedba za vstavljanje SQL
  2. Tuji ključ v SQL
  3. Ločena ključna beseda v SQL
  4. Pogledi SQL
  5. Najboljših 6 poizvedbenih primerov notranje pridruži Oracle