Čo je to SQL Group by Clause?
Klauzula GROUP BY je príkaz SQL, ktorý sa používa na zoskupenie riadkov, ktoré majú rovnaké hodnoty . V príkaze SELECT sa používa klauzula GROUP BY. Voliteľne sa používa v spojení s agregačnými funkciami na vytvorenie súhrnných správ z databázy.
To je to, čo robí, sumarizuje údaje z databázy.
Dotazy, ktoré obsahujú klauzulu GROUP BY, sa nazývajú zoskupené dotazy a pre každú zoskupenú položku vracajú iba jeden riadok.
Syntax SQL GROUP BY
Teraz, keď vieme, čo je klauzula SQL GROUP BY, pozrime sa na syntax základnej skupiny podľa dotazu.
SELECT statements… GROUP BY column_name1[,column_name2,… ] [HAVING condition];
TU
- „Príkazy SELECT ...“ je štandardný príkazový príkaz SQL SELECT.
- „ GROUP BY column_name1“ je klauzula, ktorá vykonáva zoskupenie na základe column_name1.
- „[, column_name2, ...]“ je voliteľný; predstavuje ďalšie názvy stĺpcov, ak je zoskupenie vykonané vo viac ako jednom stĺpci.
- „[HAVING condition]“ je voliteľné; používa sa na obmedzenie riadkov ovplyvnených klauzulou GROUP BY. Je to podobné ako v klauzule WHERE.
Zoskupenie pomocou jedného stĺpca
Aby sme pochopili vplyv klauzuly SQL Group By, vykonajme jednoduchý dotaz, ktorý vráti všetky položky pohlavia z tabuľky členov.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Predpokladajme, že chceme získať jedinečné hodnoty pre pohlavia. Môžeme použiť nasledujúci dotaz -
SELECT `gender` FROM `members` GROUP BY `gender`;
Vykonanie vyššie uvedeného skriptu v pracovnom stole MySQL proti Myflixdb nám dáva nasledujúce výsledky.
gender |
---|
Female |
Male |
Upozorňujeme, že boli vrátené iba dva výsledky. Je to tak preto, lebo máme iba dva typy pohlaví: mužský a ženský. Klauzula GROUP BY v SQL zoskupila všetkých „mužských“ členov dohromady a vrátila za ňu iba jeden riadok. Rovnako to bolo aj v prípade „ženských“ členov.
Zoskupovanie pomocou viacerých stĺpcov
Predpokladajme, že chceme získať zoznam filmov category_id a zodpovedajúcich rokov, v ktorých boli vydané.
Pozrime sa na výstup tohto jednoduchého dotazu
SELECT `category_id`,`year_released` FROM `movies` ;
category_id | year_released |
---|---|
1 | 2011 |
2 | 2008 |
NULL | 2008 |
NULL | 2010 |
8 | 2007 |
6 | 2007 |
6 | 2007 |
8 | 2005 |
NULL | 2012 |
7 | 1920 |
8 | NULL |
8 | 1920 |
Vyššie uvedený výsledok má veľa duplikátov.
Poďme vykonať ten istý dotaz pomocou group by v SQL -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Vykonanie vyššie uvedeného skriptu v pracovnom stole MySQL proti myflixdb nám dáva nasledujúce výsledky uvedené nižšie.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
Klauzula GROUP BY pracuje na identifikácii kategórie aj na vydanom roku s cieľom identifikovať jedinečné riadky v našom príklade vyššie.
Ak je ID kategórie rovnaké, ale zverejnený rok je iný, potom sa s riadkom zaobchádza ako s jedinečným. Ak je ID kategórie a zverejnený rok rovnaké pre viac ako jeden riadok, považuje sa to za duplikát a iba za jeden riadok. je ukázané.
Zoskupovacie a agregačné funkcie
Predpokladajme, že chceme v našej databáze celkový počet mužov a žien. Na to môžeme použiť nasledujúci skript zobrazený nižšie.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Vykonanie vyššie uvedeného skriptu v pracovnej ploche MySQL proti myflixdb nám dáva nasledujúce výsledky.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Výsledky zobrazené nižšie sú zoskupené podľa každej zverejnenej jedinečnej hodnoty pohlavia a počet zoskupených riadkov sa počíta pomocou agregačnej funkcie COUNT.
Obmedzenie výsledkov dotazu pomocou HAVING klauzuly
Nie je to vždy tak, že budeme chcieť zoskupiť všetky údaje v danej tabuľke. Budú obdobia, keď budeme chcieť obmedziť naše výsledky na určité dané kritériá. V takýchto prípadoch môžeme použiť klauzulu HAVING
Predpokladajme, že chceme poznať všetky roky vydania kategórie filmu id 8. Na dosiahnutie našich výsledkov by sme použili nasledujúci skript.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Vykonanie vyššie uvedeného skriptu v pracovnom stole MySQL proti Myflixdb nám dáva nasledujúce výsledky uvedené nižšie.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Upozorňujeme, že naša doložka GROUP BY ovplyvnila iba filmy kategórie id 8.
Zhrnutie
- Klauzula GROUP BY SQL sa používa na zoskupovanie riadkov s rovnakými hodnotami.
- Klauzula GROUP BY sa používa spolu s príkazom SQL SELECT.
- Príkaz SELECT použitý v klauzule GROUP BY možno použiť iba s názvami stĺpcov, agregačnými funkciami, konštantami a výrazmi.
- Klauzula SQL having sa používa na obmedzenie výsledkov vrátených klauzulou GROUP BY.
- Klauzula MYSQL GROUP BY sa používa na zhromažďovanie údajov z viacerých záznamov a vrátených záznamov nastavených jedným alebo viacerými stĺpcami.