Uvod u klauzulu SQL HAVING

Vrlo osnovno pitanje koje nam pada na pamet jest što je ova klauzula HAVING? Pa, klauzula HAVING koristi se za filtriranje rezultata iz SQL upita s agregatnim funkcijama. Da bi se razumio na običnom engleskom, to je naredba SQL raščlanjivaču "Hej SQL, iz naše tablice podataka o kupcima, donesite mi imena zemalja koje imaju više od milijun klijenata".

Čekaj, to je ono GDJE klauzula, zar ne? Da, to je vrlo slično načinu na koji djeluje klauzula WHERE, ali s malom razlikom. Odredba WHERE ne radi s agregiranim funkcijama.

Sada, samo da sažmemo malo o agregatnim funkcijama, to su funkcije koje uzimaju više redova kao ulaz i daju značajnije obrađeni izlaz. Nekoliko primjera su grof (), zbroj (), min (), maks (), prosjek () itd.

Zašto imati, a ne GDJE?

Vidimo da klauzule HAVING i WHERE obavljaju vrlo sličan zadatak filtriranja rezultata. Onda, što je bilo potrebno za klauzulu HAVING? Zašto se rečenica GDJE ne može koristiti sa skupnim funkcijama?

Da bismo odgovorili na to, trebali bismo razumjeti kako SQL engine tretira dvije klauzule. Klauzula FROM u svakoj SQL naredbi upućuje motor odakle treba čitati redove. Podaci se pohranjuju na disk i preuzimaju se u memoriju za obradu. Pošto se redovi čitaju jedan po jedan s diska u memoriju, oni se provjeravaju na pitanje WHERE. Redovi koji ne ispune rečenicu WHERE ne učitavaju se u memoriji. Dakle, klauzula WHERE procjenjuje se za svaki red dok ih obrađuje SQL engine.

Suprotno tome, klauzula HAVING dolazi u sliku tek nakon što su redovi učitani u memoriju. Jednom učitani u memoriji, funkcije agregata izvršavaju svoj zadatak u redovima IMAJUĆI željeno stanje.

Ako bismo stavili rečenicu WHERE s agregatnom funkcijom poput avg (), to bi zbunjivalo SQL engine oko toga treba li uključiti redak za izračun prosjeka ili ne. U osnovi, naredili bismo motoru da ne pročita redak jer nije prošao kriterij avg () u WHERE odredbi. Ali hej, da bi se utvrdilo je li prošlo ili nije uspjelo kriterij za izračun avg (), redak treba pročitati u memoriji. Stanje ćorsokaka.

Sintaksa

SELECT
FROM


GDJE - fakultativno
GROUP BY - grupira redove za primjenu agregatne funkcije
HAVING - funkcija agregata u stanju
NARUČITE PO; - odrediti redoslijed sortiranja, izborno

Napomena - s odredbom HAVING potrebna je rečenica GROUP BY. To je zato što vlasništvo klauzule treba grupu podataka za primjenu zbirne funkcije i filtriranje rezultata.

Kako djeluje klauzula HAVING?

Razjasnimo funkcioniranje klauzule HAVING u SQL-u.

Klauzulu HAVING uvijek prati klauzula GROUP BY. Odredba GROUP BY grupira podatke koji odgovaraju određenom kriteriju. Ima tri faze - podijeliti, nanijeti i kombinirati. Podjela faza dijeli redove na grupe. Faza primjene primjenjuje neke skupne funkcije na grupe podataka. Kombinirana faza daje jedinstven rezultat kombiniranjem skupina s rezultatom zbirne funkcije.

Sada kada su grupe formirane, na sliku ulazi klauzula HAVING. Klauzula HAVING tada filtrira grupe koje ne zadovoljavaju zadani uvjet.

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

Tako u gornjem primjeru vidimo da se tablica prvo dijeli na tri skupine na temelju stupca Col_A. Zatim se skupinama primjenjuje funkcija združivanja za izračunavanje prosječnih Col_B vrijednosti. To rezultira u jednom retku za svaku grupu. Redovi se tada kombiniraju i filtriraju na temelju stanja u klauzuli HAVING.

Primjer

Pogledajmo sada primjer iz stvarnog svijeta. Razmislite da imamo sljedeću tablicu kupaca i narudžbe koje su poslali kod nas.

CustomerIDIme kupcaGradZemlja
1Anja DamianBerlinNjemačka
2Denny CockettMéxico DFMeksiko
3Eleanor CalnanMéxico DFMeksiko
4Albertha AlburyLondonVelika Britanija
5Latisha NembhardLuleåŠvedska
6Madalene BingManhajmNjemačka
7Rebecka BeegleStrazburFrancuska
8Rosy TippieMadridŠpanija
9Audie KhanMarseilleFrancuska
10Hildegard BurrowesTsawassenKanada
11Cordell DutrembleLondonVelika Britanija
12Nora ReynaBuenos AiresArgentina
13Šuma UrsulaMéxico DFMeksiko
14Claudie NeelBernŠvicarska
15Portia YeeSao PauloBrazil
16Angila SegarraLondonVelika Britanija
17Lise WexlerAachenNjemačka
18Ned MendivilNantesFrancuska
19Sara VidaurriLondonVelika Britanija
20Tayna NavinGrazAustrija
21Pura RaySao PauloBrazil
22Erika ByardMadridŠpanija
23Jimmie LukeLilleFrancuska
24Shayla ByingtonBrackeŠvedska
25Christiana BodenMünchenNjemačka
26Irina NittaNantesFrancuska
27Bryanna AllsTorinoItalija
28Norah PickenLisboaPortugal
29Moriah StwartBarselonaŠpanija
30Idella HarriottSevillaŠpanija
OrderIDCustomerIDDatum narudžbe
10254141996/11/07
10.2582017-07-1996
10.2591318-07-1996
10.2632023-07-1996
10.2642424-07-1996
10.265725-07-1996
10.2672529-07-1996
10.27851996/12/08
10280514-08-1996
102891126-08-1996
102901527-08-1996
1029771996/04/09
10303301996/11/09
10.308218-09-1996
10.3111820-09-1996
10.32681996/10/10
10327241996/11/10
10.3282814-10-1996
10.331916-10-1996
10.3372524-10-1996
10340929-10-1996
103422530-10-1996
10.347211996/06/11
10351201996/11/11
10.352281996/12/11
10.355415-11-1996
10360722-11-1996
10.362925-11-1996
103631726-11-1996
10.3641926-11-1996
10365327-11-1996
10.3662928-11-1996
10.3682029-11-1996
10370141996/03/12
10.378241996/10/12
103822013-12-1996
10.383416-12-1996
10.384516-12-1996
10.3862118-12-1996
10.3891020-12-1996
10.3902023-12-1996
10.3911723-12-1996
10.3962527-12-1996
10400191997/01/01
10.402201997/02/01
10.403201997/03/01
10.408231997/08/01
10410101997/10/01
10.411101997/10/01
10.4142114-01-1997
10.4222722-01-1997
10.4262927-01-1997
104302030-01-1997
104311030-01-1997
10434241997/03/02
10435161997/04/02
1043671997/05/02
10.442201997/11/02

Želimo znati kupce iz kojih zemalja su zajedno poslali ukupno 5 ili više narudžbi. To može biti jedan kupac koji izdaje više od 5 narudžbi ili 5 kupaca koji postavljaju po 1 narudžbu.

Da bismo to postigli, trebali bismo

1. korak : Pridružite se dvije tablice

2. korak: grupirajte kupce prema njihovim zemljama

3. korak: prebrojite broj naloga za svaku grupu

4. korak: filtrirajte rezultate za 5 ili više narudžbi

Formirajmo naredbu:

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

Evo rezultata:

ZemljaNumberOfOrders
Austrija10
Francuska9
Švedska7
Njemačka6
Velika Britanija6

Zaključak - SQL HAVING klauzula

Dakle, vidjeli smo koja je svrha klauzule HAVING i kako funkcionira. Važno je razumjeti osnovne načine rada, jer se u suprotnom možete zbuniti zašto klauzula HAVING ne daje željene rezultate. Nastavite igrati s raznim tablicama i pridružite se i kombinacije, uz klauzulu HAVING.

Preporučeni članci

Ovo je vodič za klauzulu SQL HAVING. Ovdje razgovaramo o radu klauzule HAVING u SQL-u i primjerimo sa sljedećom tablicom kupaca. Možete i pregledati naše druge predložene članke -

  1. SQL upit za umetanje
  2. Strani ključ u SQL-u
  3. Različita ključna riječ u SQL-u
  4. SQL prikazi
  5. Top 6 primjera upita unutarnjeg pridruživanja Oracleu

Kategorija: