GROUP BY
GROUP 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
GROUP BY
a agregační funkcePoužití GROUP BY
nabízí možnost volat tzv. agregační funkce. 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
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
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
. 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
.