Úvod do klauzuly SQL HAVING
Najzákladnejšou otázkou, ktorá prichádza na myseľ, je čo je táto klauzula HAVING? Klauzula HAVING sa používa na odfiltrovanie výsledkov z dotazu SQL pomocou agregovaných funkcií. Aby sme to pochopili v jednoduchej angličtine, prikazuje analyzátoru SQL „Ahoj SQL, z tabuľky s údajmi o zákazníkoch mi načítať názvy krajín, ktoré majú viac ako 1 milión zákazníkov“.
Počkajte, to je to, čo robí klauzula WHERE, však? Áno, je to veľmi podobné tomu, ako funguje klauzula WHERE, ale s malým rozdielom. Klauzula WHERE nefunguje s agregovanými funkciami.
Teraz len na zhrnutie trocha agregovaných funkcií, sú to funkcie, ktoré berú viac riadkov ako vstup a poskytujú výraznejšie spracovaný výstup. Niekoľko príkladov sú Count (), Sum (), Min (), Max (), Priem. () Atď.
Prečo MÁME A NIE KDE?
Vidíme, že klauzuly HAVING a WHERE vykonávajú veľmi podobnú úlohu na filtrovanie výsledkov. Aká bola teda potreba klauzuly HAVING? Prečo nemohla byť klauzula WHERE použitá s agregovanými funkciami?
Aby sme na to mohli odpovedať, musíme pochopiť, ako stroj SQL zaobchádza s týmito dvoma doložkami. Klauzula FROM v každom príkaze SQL hovorí stroju, odkiaľ majú čítať riadky. Dáta sa ukladajú na disk a načítajú sa do pamäte na spracovanie. Keď sa riadky čítajú jeden po druhom z disku do pamäte, skontroluje sa, či je klauzula WHERE. Riadky, ktoré zlyhajú klauzulu WHERE, sa nenačítajú do pamäte. Klauzula WHERE sa teda vyhodnocuje pre každý riadok, pretože sú spracovávané strojom SQL.
Naopak, klauzula HAVING sa objaví až po načítaní riadkov do pamäte. Po načítaní do pamäte vykonávajú agregované funkcie svoju úlohu v riadkoch, ktoré majú požadovaný stav.
Ak by sme teraz vložili klauzulu WHERE s agregačnou funkciou, ako je napríklad avg (), znamenalo by to, že by sa stroj SQL zamieňal s otázkou, či zahrnúť riadok na výpočet priemeru alebo nie. V podstate by sme prikázali motoru, aby neprečítal riadok, pretože neprešiel kritériami avg () v klauzule WHERE. Ale hej, aby sa zistilo, či vyhovelo alebo neprošlo výpočtovými kritériami avg (), musí sa riadok načítať do pamäte. Stav bezvýchodiskovej situácie.
Syntax
SELECT
FROM
CustomerID | Meno zákazníka | veľkomesto | Krajina |
1 | Anja Damian | Berlín | Nemecko |
2 | Denny Cockett | México DF | Mexiko |
3 | Eleanor Calnanová | México DF | Mexiko |
4 | Albertha Albury | Londýn | Spojené kráľovstvo |
5 | Latisha Nembhard | Luleå | Švédsko |
6 | Madalene Bing | Mannheim | Nemecko |
7 | Rebecka Beegle | Strasbourg | Francúzsko |
8 | Rosy Tippie | madrid | španielsko |
9 | Audie Khan | marseille | Francúzsko |
10 | Hildegard Burrowes | Tsawassen | Kanada |
11 | Cordell Dutremble | Londýn | Spojené kráľovstvo |
12 | Nora Reyna | Buenos Aires | Argentína |
13 | Ursula Laforest | México DF | Mexiko |
14 | Claudie Neel | Bern | švajčiarsko |
15 | Portia Yee | Sao Paulo | Brazília |
16 | Angila Segarra | Londýn | Spojené kráľovstvo |
17 | Lise Wexler | aachen | Nemecko |
18 | Ned Mendivil | Nantes | Francúzsko |
19 | Sara Vidaurri | Londýn | Spojené kráľovstvo |
20 | Tayna Navin | Graz | Rakúsko |
21 | Pura Ray | Sao Paulo | Brazília |
22 | Erika Byard | madrid | španielsko |
23 | Jimmie Luke | Lille | Francúzsko |
24 | Shayla Byingtonová | Bräcke | Švédsko |
25 | Christiana Boden | München | Nemecko |
26 | Irina Nitta | Nantes | Francúzsko |
27 | Bryanna Alls | Torino | Taliansko |
28 | Norah Picken | Lisboa | Portugalsko |
29 | Moriah Stwart | Barcelona | španielsko |
30 | Idella Harriott | Sevilla | španielsko |
Číslo objednávky | CustomerID | Dátum objednávky |
10254 | 14 | 11.07.1996 |
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 | 12.08.1996 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 4.9.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 | 3.1.1997 |
10408 | 23 | 8.1.1997 |
10410 | 10 | 10.01.1997 |
10411 | 10 | 10.01.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 | 3.2.1997 |
10435 | 16 | 4.2.1997 |
10436 | 7 | 5.2.1997 |
10442 | 20 | 11.02.1997 |
Teraz chceme poznať zákazníkov, v ktorých krajinách sme spolu zadali spolu 5 alebo viac objednávok. Môže to byť jediný zákazník, ktorý zadáva viac ako 5 objednávok, alebo 5 zákazníkov, ktorí zadávajú každý 1 objednávku.
Aby sme to dosiahli, museli by sme
Krok 1 : Pripojte sa k dvom tabuľkám
Krok 2: Zoskupte zákazníkov podľa ich krajín
Krok 3: Spočítajte počet objednávok pre každú skupinu
Krok 4: Filtrujte výsledky pre 5 alebo viac objednávok
Vytvorme príkaz:
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 sú výsledky:
Krajina | NumberOfOrders |
Rakúsko | 10 |
Francúzsko | 9 |
Švédsko | 7 |
Nemecko | 6 |
Spojené kráľovstvo | 6 |
Záver - klauzula SQL HAVING
Preto sme videli, aký je účel klauzuly HAVING a ako to funguje. Je dôležité porozumieť základnému fungovaniu, inak by ste sa mohli zmiasť, prečo klauzula HAVING neprináša požadované výsledky. Pokračujte v hre s rôznymi stolmi, spojeniami a kombináciami spolu s doložkou HAVING.
Odporúčané články
Toto je príručka k klauzule SQL HAVING. Tu diskutujeme fungovanie klauzuly HAVING v SQL a príklad s nasledujúcou tabuľkou zákazníkov. Môžete si tiež prečítať naše ďalšie navrhované články -
- SQL Vložiť dotaz
- Cudzí kľúč v SQL
- Rozlišovacie kľúčové slovo v SQL
- Zobrazenia SQL
- 6 najčastejších dopytových príkladov vnútorného spojenia v systéme Oracle