Co je to SQL Group by Clause?
Klauzule GROUP BY je příkaz SQL, který se používá ke seskupení řádků, které mají stejné hodnoty . Klauzule GROUP BY se používá v příkazu SELECT. Volitelně se používá ve spojení s agregačními funkcemi k vytváření souhrnných zpráv z databáze.
To je to, co dělá, sumarizuje data z databáze.
Dotazy, které obsahují klauzuli GROUP BY, se nazývají seskupené dotazy a pro každou seskupenou položku vrací pouze jeden řádek.
Syntaxe SQL GROUP BY
Nyní, když víme, co je klauzule SQL GROUP BY, podívejme se na syntaxi základní skupiny podle dotazu.
SELECT statements… GROUP BY column_name1[,column_name2,… ] [HAVING condition];
TADY
- „Příkazy SELECT…“ je standardní dotaz příkazu SQL SELECT.
- „ GROUP BY column_name1“ je klauzule, která provádí seskupení na základě column_name1.
- „[, název_sloupce2, ...]“ je volitelný; představuje další názvy sloupců, když je seskupení provedeno na více než jednom sloupci.
- „[HAVING condition]“ je volitelné; používá se k omezení řádků ovlivněných klauzulí GROUP BY. Je to podobné klauzuli WHERE.
Seskupování pomocí jednoho sloupce
Abychom pochopili účinek klauzule SQL Group By, proveďme jednoduchý dotaz, který vrátí všechny položky pohlaví z tabulky členů.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Předpokládejme, že chceme získat jedinečné hodnoty pro pohlaví. Můžeme použít následující dotaz -
SELECT `gender` FROM `members` GROUP BY `gender`;
Provedení výše uvedeného skriptu v pracovní ploše MySQL proti Myflixdb nám dává následující výsledky.
gender |
---|
Female |
Male |
Všimněte si, že byly vráceny pouze dva výsledky. Je to proto, že máme pouze dva typy pohlaví: mužský a ženský. Klauzule GROUP BY v SQL seskupila všechny členy "Muž" dohromady a vrátila za ni pouze jeden řádek. Totéž udělalo s „ženskými“ členy.
Seskupování pomocí více sloupců
Předpokládejme, že chceme získat seznam filmů category_id a odpovídající roky, ve kterých byly vydány.
Pojďme sledovat výstup tohoto 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 |
Výše uvedený výsledek má mnoho duplikátů.
Provedeme stejný dotaz pomocí group by v SQL -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Provedení výše uvedeného skriptu v pracovní ploše MySQL proti myflixdb nám dává následující výsledky uvedené níže.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
Klauzule GROUP BY funguje na uvolněném ID kategorie i roku, aby identifikovala jedinečné řádky v našem výše uvedeném příkladu.
Pokud je ID kategorie stejné, ale rok vydání se liší, pak je řádek považován za jedinečný. Pokud je ID kategorie a rok vydání stejný pro více než jeden řádek, považuje se to za duplikát a pouze jeden řádek je ukázáno.
Seskupování a agregace funkcí
Předpokládejme, že v naší databázi chceme celkový počet mužů a žen. K tomu můžeme použít následující skript zobrazený níže.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Provedení výše uvedeného skriptu v pracovní ploše MySQL proti myflixdb nám dává následující výsledky.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Výsledky zobrazené níže jsou seskupeny podle každé zveřejněné jedinečné hodnoty pohlaví a počet seskupených řádků se počítá pomocí agregační funkce COUNT.
Omezení výsledků dotazu pomocí klauzule HAVING
Není to vždy tak, že budeme chtít provést seskupení všech dat v dané tabulce. Budou chvíle, kdy budeme chtít omezit naše výsledky na určitá daná kritéria. V takových případech můžeme použít klauzuli HAVING
Předpokládejme, že chceme znát všechny roky vydání filmové kategorie id 8. K dosažení našich výsledků bychom použili následující skript.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Provedení výše uvedeného skriptu v pracovní ploše MySQL proti Myflixdb nám dává následující výsledky uvedené níže.
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še klauzule GROUP BY ovlivnila pouze filmy s kategorií id 8.
souhrn
- Klauzule GROUP BY SQL se používá ke seskupení řádků se stejnými hodnotami.
- Klauzule GROUP BY se používá společně s příkazem SQL SELECT.
- Příkaz SELECT použitý v klauzuli GROUP BY lze použít pouze obsahující názvy sloupců, agregační funkce, konstanty a výrazy.
- Klauzule SQL having se používá k omezení výsledků vrácených klauzulí GROUP BY.
- Klauzule MYSQL GROUP BY se používá ke shromažďování dat z více záznamů a vrácených záznamů nastavených jedním nebo více sloupci.