Ú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
Zákaznické identifikační číslo | Jméno zákazníka | Město | Země |
1 | Anja Damian | Berlín | Německo |
2 | Denny Cockett | México DF | Mexiko |
3 | Eleanor Calnanová | México DF | Mexiko |
4 | Albertha Albury | Londýn | Spojené království |
5 | Latisha Nembhardová | Luleå | Švédsko |
6 | Madalene Bing | Mannheim | Německo |
7 | Rebecka Beegle | Štrasburk | Francie |
8 | Rosy Tippie | Madrid | Španělsko |
9 | Audie Khan | Marseille | Francie |
10 | Hildegard Burrowes | Tsawassen | Kanada |
11 | Cordell Dutremble | Londýn | Spojené království |
12 | Nora Reyna | Buenos Aires | Argentina |
13 | Ursula Laforest | México DF | Mexiko |
14 | Claudie Neel | Bern | Švýcarsko |
15 | Portia Yee | Sao Paulo | Brazílie |
16 | Angila Segarra | Londýn | Spojené království |
17 | Lise Wexler | Cáchy | Německo |
18 | Ned Mendivil | Nantes | Francie |
19 | Sara Vidaurri | Londýn | Spojené království |
20 | Tayna Navin | Graz | Rakousko |
21 | Pura Ray | Sao Paulo | Brazílie |
22 | Erika Byard | Madrid | Španělsko |
23 | Jimmie Luke | Lille | Francie |
24 | Shayla Byingtonová | Bräcke | Švédsko |
25 | Christiana Boden | München | Německo |
26 | Irina Nitta | Nantes | Francie |
27 | Bryanna Alls | Turín | Itálie |
28 | Norah Picken | Lisboa | Portugalsko |
29 | Moriah Stwart | Barcelona | Španělsko |
30 | Idella Harriottová | Sevilla | Španělsko |
Číslo objednávky | Zákaznické identifikační číslo | Datum 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 | 04-09-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 | 01-01-1997 |
10402 | 20 | 02-01-1997 |
10403 | 20 | 03-01-1997 |
10408 | 23 | 08-01-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 | 03-02-1997 |
10435 | 16 | 04-02-1997 |
10436 | 7 | 05-02-1997 |
10442 | 20 | 11-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 |
Rakousko | 10 |
Francie | 9 |
Švédsko | 7 |
Německo | 6 |
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 -
- SQL Vložit dotaz
- Cizí klíč v SQL
- Rozlišovací klíčové slovo v SQL
- Zobrazení SQL
- Top 6 příkladů dotazů vnitřního spojení v Oracle