Úvod do klauzule SQL HAVING

Základní otázkou, která přichází na mysl, je to, co je tato klauzule HAVING? Klauzula HAVING se používá k odfiltrování výsledků z dotazu SQL pomocí agregovaných funkcí. Abychom to pochopili prostou angličtinou, přikazuje SQL parseru „Ahoj SQL, z naší tabulky údajů o zákaznících, načtěte mi jména zemí s více než 1 milionem zákazníků“.

Počkej, to je to, co dělá klauzula WHERE, že? Ano, to je velmi podobné tomu, jak funguje klauzule WHERE, ale s nepatrným rozdílem. Klauzule WHERE nefunguje s agregovanými funkcemi.

Nyní, jen pro shrnutí trochu o agregovaných funkcích, jsou to funkce, které berou více řádků jako vstup a poskytují významně zpracovaný výstup. Několik příkladů jsou Count (), Sum (), Min (), Max (), Prům. () Atd.

Proč máme a ne kde?

Vidíme, že klauzule HAVING a WHERE provádějí velmi podobný úkol k odfiltrování výsledků. Jaká byla potřeba klauzule HAVING? Proč nelze klauzuli WHERE použít s agregovanými funkcemi?

Abychom na to odpověděli, musíme pochopit, jak SQL engine zachází s těmito dvěma doložkami. Klauzule FROM v každém příkazu SQL říká motoru, odkud mají řádky číst. Data jsou uložena na disk a načtena do paměti pro zpracování. Protože jsou řádky čteny jeden po druhém z disku do paměti, jsou kontrolovány na klauzuli WHERE. Řádky, které selhají klauzuli WHERE, se nenačtou do paměti. Klauzule WHERE je tedy vyhodnocena pro každý řádek, protože jsou zpracovávány strojem SQL.

Naopak, klauzule HAVING přichází do obrazu až po načtení řádků do paměti. Po načtení do paměti vykonávají agregační funkce svou úlohu v řádcích, které mají požadovanou podmínku.

Nyní, pokud bychom měli vložit klauzuli WHERE s agregovanou funkcí, jako je avg (), znamenalo by to, že by byl stroj SQL matoucí, zda zahrnout řádek pro výpočet průměru nebo ne. V zásadě bychom přikázali motoru, aby řádek nečetl, protože neprošel kritérii avg () v klauzuli WHERE. Ale hej, aby bylo možné určit, zda vyhověl nebo neprošel výpočtovými kritérii avg (), musí být řádek načten do paměti. Stav zablokování.

Syntaxe

SELECT
FROM


KDE - nepovinné
GROUP BY - seskupuje řádky pro použití agregační funkce
HAVING - agregační funkce ve stavu
SEŘADIT PODLE ; - definujte pořadí třídění, volitelné

Poznámka - Klauzule GROUP BY je vyžadována u klauzule HAVING. Důvodem je skutečnost, že klauzule S vyžaduje skupinu dat, aby mohla použít agregační funkci a odfiltrovat výsledky.

Jak funguje klauzule HAVING?

Chápeme fungování klauzule HAVING v SQL.

Klauzule HAVING je vždy doprovázena klauzulou GROUP BY. Klauzule GROUP BY seskupuje data, která odpovídají určitému kritériu. Má tři fáze - rozdělit, aplikovat a kombinovat. Rozdělené fáze dělí řádky do skupin. Fáze použití aplikuje některé agregované funkce na skupiny dat. Kombinovaná fáze vytvoří jediný výsledek kombinací skupin s výsledkem agregované funkce.

Nyní, když jsou skupiny vytvořeny, se do obrázku dostává klauzule HAVING. Klauzule HAVING pak odfiltruje skupiny, které nesplňují danou podmínku.

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

Ve výše uvedeném příkladu tedy vidíme, že tabulka je nejprve rozdělena do tří skupin na základě sloupce Col_A. Agregační funkce pro výpočet průměrných hodnot Col_B se potom použije na skupiny. Výsledkem je jeden řádek pro každou skupinu. Řádky jsou pak kombinovány a filtrovány na základě stavu v klauzuli HAVING.

Příklad

Nyní se podívejme na příklad ze skutečného světa. Zvažte, že máme následující tabulku zákazníků a objednávky, které u nás zadali.

Zákaznické identifikační čísloJméno zákazníkaMěstoZemě
1Anja DamianBerlínNěmecko
2Denny CockettMéxico DFMexiko
3Eleanor CalnanováMéxico DFMexiko
4Albertha AlburyLondýnSpojené království
5Latisha NembhardováLuleåŠvédsko
6Madalene BingMannheimNěmecko
7Rebecka BeegleŠtrasburkFrancie
8Rosy TippieMadridŠpanělsko
9Audie KhanMarseilleFrancie
10Hildegard BurrowesTsawassenKanada
11Cordell DutrembleLondýnSpojené království
12Nora ReynaBuenos AiresArgentina
13Ursula LaforestMéxico DFMexiko
14Claudie NeelBernŠvýcarsko
15Portia YeeSao PauloBrazílie
16Angila SegarraLondýnSpojené království
17Lise WexlerCáchyNěmecko
18Ned MendivilNantesFrancie
19Sara VidaurriLondýnSpojené království
20Tayna NavinGrazRakousko
21Pura RaySao PauloBrazílie
22Erika ByardMadridŠpanělsko
23Jimmie LukeLilleFrancie
24Shayla ByingtonováBräckeŠvédsko
25Christiana BodenMünchenNěmecko
26Irina NittaNantesFrancie
27Bryanna AllsTurínItálie
28Norah PickenLisboaPortugalsko
29Moriah StwartBarcelonaŠpanělsko
30Idella HarriottováSevillaŠpanělsko
Číslo objednávkyZákaznické identifikační čísloDatum 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
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
104001901-01-1997
104022002-01-1997
104032003-01-1997
104082308-01-1997
104101010-01-1997
104111010-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342403-02-1997
104351604-02-1997
10436705-02-1997
104422011-02-1997

Nyní chceme znát zákazníky, u kterých zemí jsme u nás zadali celkem 5 nebo více objednávek. Může to být jediný zákazník zadávající více než 5 objednávek nebo 5 zákazníků zadávajících vždy 1 objednávku.

Abychom toho dosáhli, museli bychom

Krok 1 : Připojte se ke dvěma tabulkám

Krok 2: Seskupte zákazníky podle jejich zemí

Krok 3: Spočítejte počet objednávek pro každou skupinu

Krok 4: Filtrujte výsledky pro 5 nebo více objednávek

Vytvořme pří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

Zde jsou výsledky:

ZeměNumberOfOrders
Rakousko10
Francie9
Švédsko7
Německo6
Spojené království6

Závěr - klauzula SQL HAVING

Viděli jsme tedy, jaký je účel klauzule HAVING a jak to funguje. Je důležité porozumět základnímu fungování, jinak byste si mohli být jisti, proč klauzule HAVING nepřináší požadované výsledky. Pokračujte v hraní s různými stoly a spojeními a kombinacemi společně s klauzulí HAVING.

Doporučené články

Toto je průvodce klauzulí SQL HAVING. Zde diskutujeme fungování klauzule HAVING v SQL a příklad s následující tabulkou zákazníků. Můžete si také prohlédnout naše další doporučené články -

  1. SQL Vložit dotaz
  2. Cizí klíč v SQL
  3. Rozlišovací klíčové slovo v SQL
  4. Zobrazení SQL
  5. Top 6 příkladů dotazů vnitřního spojení v Oracle