GROUP BY
Author
Albert FloresGROUP BY je syntaktická konstrukce jazyka SQL pro agregaci záznamů vybíraných pomocí příkazu SELECT.
Příklad použití: Máme tabulku článků a u každého z nich je mj. uložen i rok, kdy byl napsán. Chceme získat přehled toho, kolik článků bylo napsáno který rok.
SELECT rok,Count(*) FROM clanky GROUP BY rok;
Výstupem by mohlo být např.:
+------+----------+ | rok | Count(*) | +------+----------+ | 2006 | 7 | | 2007 | 15 | | 2008 | 22 | +------+----------+
Další vlastnosti
GROUP BY a agregační funkce
Použití GROUP BY nabízí možnost volat tzv. agregační funkce. +more Nejběžnější použití je získání počtu záznamů odpovídající každé jednotlivé hodnotě jiného sloupce (v tomto případě roku), časté je také získání součtu, aritmetického průměru či jiných statistických hodnot z vybíraných záznamů.
HAVING
Pokud chceme výpis s GROUP BY ještě nějak dodatečně omezit, nelze použít klausuli WHERE, neboť ta s agregačními funkcemi nepočítá; je proto nutno použít speciální klíčové slovo a to HAVING, za kterým můžeme definovat podmínku, která operuje s agregačními funkcemi.
WITH ROLLUP
Několik málo databázových systémů (jako např. MySQL) podporuje navíc konstrukci WITH ROLLUP, která se umisťuje za klausuli GROUP BY. +more Výpis s konstrukcí WITH ROLLUP způsobí, že za standardním výpisem se objeví řádek s hodnotou NULL na místo sloupce, podle kterého jsou data agregována (je-li uveden), který znamená celkový údaj a na místě hodnoty agregační funkce pak hodnota za všechny právě uvedené výsledky těchto funkcí - např. pro počet (Count) je to počet všech výskytů, pro součet (Sum) je to celkový součet (grand total) atp.
Pro výše uvedený příklad by tedy dotaz
SELECT rok,Count(*) FROM clanky GROUP BY rok WITH ROLLUP;
vygeneroval výstup podobný tomuto:
+------+----------+ | rok | Count(*) | +------+----------+ | 2006 | 7 | | 2007 | 15 | | 2008 | 22 | | NULL | 44 | +------+----------+
Hodnota NULL v posledním řádky zde tedy reprezentuje souhrnný údaj pro všechny roky. Agregovaných sloupců nebo výrazů z nich může být i víc - v tom případě do výstupu výběru budou jako NULL začleněny souhrnné hodnoty pro sloupce v opačném pořadí, než které bylo uvedeno za klauzulí GROUP BY.