Ú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


KDE - nepovinné
GROUP BY - zoskupuje riadky na použitie agregovanej funkcie
HAVING - agregátna funkcia v stave
ZORADIŤ PODĽA ; - definujte poradie triedenia, voliteľné

Poznámka - Klauzula GROUP BY je povinná s klauzula HAVING. Dôvodom je skutočnosť, že klauzula S vyžaduje, aby skupina údajov použila agregovanú funkciu a odfiltrovala výsledky.

Ako funguje klauzula HAVING?

Pochopme fungovanie klauzuly HAVING v SQL.

Klauzula HAVING je vždy sprevádzaná doložkou GROUP BY. Klauzula GROUP BY zoskupuje údaje, ktoré zodpovedajú určitému kritériu. Má tri fázy - rozdelenie, použitie a kombinovanie. Rozdelená fáza rozdelí riadky do skupín. Fáza aplikovania aplikuje niektoré agregované funkcie na skupiny údajov. Kombinovaná fáza vytvorí jediný výsledok kombináciou skupín s výsledkom agregovanej funkcie.

Po vytvorení skupín sa na obrázku objaví klauzula HAVING. Klauzula HAVING potom odfiltruje skupiny, ktoré nespĺňajú danú podmienku.

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

Vo vyššie uvedenom príklade teda vidíme, že tabuľka sa najprv rozdelí do troch skupín na základe stĺpca Col_A. Agregovaná funkcia na výpočet priemeru hodnôt Col_B sa potom použije na skupiny. Výsledkom bude jeden riadok pre každú skupinu. Riadky sa potom kombinujú a filtrujú na základe stavu v klauzule HAVING.

príklad

Teraz sa pozrime na príklad v skutočnom svete. Zoberme si, že máme nasledujúcu tabuľku zákazníkov a objednávky, ktoré zadali u nás.

CustomerIDMeno zákazníkaveľkomestoKrajina
1Anja DamianBerlínNemecko
2Denny CockettMéxico DFMexiko
3Eleanor CalnanováMéxico DFMexiko
4Albertha AlburyLondýnSpojené kráľovstvo
5Latisha NembhardLuleåŠvédsko
6Madalene BingMannheimNemecko
7Rebecka BeegleStrasbourgFrancúzsko
8Rosy Tippiemadridšpanielsko
9Audie KhanmarseilleFrancúzsko
10Hildegard BurrowesTsawassenKanada
11Cordell DutrembleLondýnSpojené kráľovstvo
12Nora ReynaBuenos AiresArgentína
13Ursula LaforestMéxico DFMexiko
14Claudie NeelBernšvajčiarsko
15Portia YeeSao PauloBrazília
16Angila SegarraLondýnSpojené kráľovstvo
17Lise WexleraachenNemecko
18Ned MendivilNantesFrancúzsko
19Sara VidaurriLondýnSpojené kráľovstvo
20Tayna NavinGrazRakúsko
21Pura RaySao PauloBrazília
22Erika Byardmadridšpanielsko
23Jimmie LukeLilleFrancúzsko
24Shayla ByingtonováBräckeŠvédsko
25Christiana BodenMünchenNemecko
26Irina NittaNantesFrancúzsko
27Bryanna AllsTorinoTaliansko
28Norah PickenLisboaPortugalsko
29Moriah StwartBarcelonašpanielsko
30Idella HarriottSevillašpanielsko
Číslo objednávkyCustomerIDDátum objednávky
102541411.07.1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
10278512.08.1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
1029774.9.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
10403203.1.1997
10408238.1.1997
104101010.01.1997
104111010.01.1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
10434243.2.1997
10435164.2.1997
1043675.2.1997
104422011.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:

KrajinaNumberOfOrders
Rakúsko10
Francúzsko9
Švédsko7
Nemecko6
Spojené kráľovstvo6

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 -

  1. SQL Vložiť dotaz
  2. Cudzí kľúč v SQL
  3. Rozlišovacie kľúčové slovo v SQL
  4. Zobrazenia SQL
  5. 6 najčastejších dopytových príkladov vnútorného spojenia v systéme Oracle