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
CustomerID | Ime kupca | Grad | Zemlja |
1 | Anja Damian | Berlin | Njemačka |
2 | Denny Cockett | México DF | Meksiko |
3 | Eleanor Calnan | México DF | Meksiko |
4 | Albertha Albury | London | Velika Britanija |
5 | Latisha Nembhard | Luleå | Švedska |
6 | Madalene Bing | Manhajm | Njemačka |
7 | Rebecka Beegle | Strazbur | Francuska |
8 | Rosy Tippie | Madrid | Španija |
9 | Audie Khan | Marseille | Francuska |
10 | Hildegard Burrowes | Tsawassen | Kanada |
11 | Cordell Dutremble | London | Velika Britanija |
12 | Nora Reyna | Buenos Aires | Argentina |
13 | Šuma Ursula | México DF | Meksiko |
14 | Claudie Neel | Bern | Švicarska |
15 | Portia Yee | Sao Paulo | Brazil |
16 | Angila Segarra | London | Velika Britanija |
17 | Lise Wexler | Aachen | Njemačka |
18 | Ned Mendivil | Nantes | Francuska |
19 | Sara Vidaurri | London | Velika Britanija |
20 | Tayna Navin | Graz | Austrija |
21 | Pura Ray | Sao Paulo | Brazil |
22 | Erika Byard | Madrid | Španija |
23 | Jimmie Luke | Lille | Francuska |
24 | Shayla Byington | Bracke | Švedska |
25 | Christiana Boden | München | Njemačka |
26 | Irina Nitta | Nantes | Francuska |
27 | Bryanna Alls | Torino | Italija |
28 | Norah Picken | Lisboa | Portugal |
29 | Moriah Stwart | Barselona | Španija |
30 | Idella Harriott | Sevilla | Španija |
OrderID | CustomerID | Datum narudžbe |
10254 | 14 | 1996/11/07 |
10.258 | 20 | 17-07-1996 |
10.259 | 13 | 18-07-1996 |
10.263 | 20 | 23-07-1996 |
10.264 | 24 | 24-07-1996 |
10.265 | 7 | 25-07-1996 |
10.267 | 25 | 29-07-1996 |
10.278 | 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 |
10.308 | 2 | 18-09-1996 |
10.311 | 18 | 20-09-1996 |
10.326 | 8 | 1996/10/10 |
10327 | 24 | 1996/11/10 |
10.328 | 28 | 14-10-1996 |
10.331 | 9 | 16-10-1996 |
10.337 | 25 | 24-10-1996 |
10340 | 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10.347 | 21 | 1996/06/11 |
10351 | 20 | 1996/11/11 |
10.352 | 28 | 1996/12/11 |
10.355 | 4 | 15-11-1996 |
10360 | 7 | 22-11-1996 |
10.362 | 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10.364 | 19 | 26-11-1996 |
10365 | 3 | 27-11-1996 |
10.366 | 29 | 28-11-1996 |
10.368 | 20 | 29-11-1996 |
10370 | 14 | 1996/03/12 |
10.378 | 24 | 1996/10/12 |
10382 | 20 | 13-12-1996 |
10.383 | 4 | 16-12-1996 |
10.384 | 5 | 16-12-1996 |
10.386 | 21 | 18-12-1996 |
10.389 | 10 | 20-12-1996 |
10.390 | 20 | 23-12-1996 |
10.391 | 17 | 23-12-1996 |
10.396 | 25 | 27-12-1996 |
10400 | 19 | 1997/01/01 |
10.402 | 20 | 1997/02/01 |
10.403 | 20 | 1997/03/01 |
10.408 | 23 | 1997/08/01 |
10410 | 10 | 1997/10/01 |
10.411 | 10 | 1997/10/01 |
10.414 | 21 | 14-01-1997 |
10.422 | 27 | 22-01-1997 |
10.426 | 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 |
10.442 | 20 | 1997/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:
Zemlja | NumberOfOrders |
Austrija | 10 |
Francuska | 9 |
Švedska | 7 |
Njemačka | 6 |
Velika Britanija | 6 |
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 -
- SQL upit za umetanje
- Strani ključ u SQL-u
- Različita ključna riječ u SQL-u
- SQL prikazi
- Top 6 primjera upita unutarnjeg pridruživanja Oracleu