Agregační funkce
Agregační funkce jsou v kontextu databázových programů statistické funkce, pomocí kterých systém řízení báze dat umožňuje seskupit vybrané řádky dotazu (např. v SQL získané příkazem SELECT) a spočítat nad nimi výsledek určité aritmetické nebo statistické funkce.
Ukázky v různých prostředích
[editovat | editovat zdroj]Agregační funkce se v SQL používají s konstrukcí GROUP BY, například:
SELECT department, AVG(salary) as avg_salary FROM employees GROUP BY department;
V Pythonu se obvykle používá balíček Pandas (který se obvykle importuje příkazem import pandas as pd), v němž agregace vypadá například takto:
df.groupby('department')['salary'].agg(['mean', 'sum', 'count'])
V programu SPSS se využívá příkaz AGGREGATE, například
AGGREGATE /OUTFILE=* MODE=ADDVARIABLES /BREAK=department /avg_salary=MEAN(salary).
V programovacím jazyce R se agreguje nejčastěji takto:
library(dplyr) employees %>% group_by(department) %>% summarise(avg_salary = mean(salary))
Agregace
[editovat | editovat zdroj]Při výběru řádků z tabulky (nebo tabulek) relačních databází SQL dovoluje výsledné řádky seskupit (agregovat) podle zadaného sloupce nebo výrazu z nich složeného pomocí syntaktické konstrukce GROUP BY. Při použití této konstrukce lze získat i výsledek některých statistických funkcí (nejčastěji je to aritmetický průměr, minimum, maximum, složitější, tzv. populační funkce, směrodatné odchylky a variance; nebo naopak obyčejný součet či počet řádků, které byly pod každou jednotlivou hodnotou seskupeny). GROUP BY lze výjimečně vynechat, např. pro vypsání výsledku agregační funkce jednoho sloupce nad celou tabulkou.
Vícenásobné seskupení
[editovat | editovat zdroj]Databázové stroje většinou podporují i vícenásobné seskupení / seskupení podle více sloupců (nebo výrazů z nich složených). V takovém případě se názvy sloupců za klíčovým slovem GROUP BY
oddělují čárkou. Sloupec (nebo výraz) uvedený jako první má nejvyšší prioritu, poslední sloupec nebo výraz má prioritu nejnižší.
Nejčastější agregační funkce
[editovat | editovat zdroj]Následující tabulka popisuje zkratky pro nejběžnější agregační funkce. Podpora těch ostatních může být závislá na konkrétním databázovém systému; taktéž zkratky se mohou lišit.
Název | Popis |
---|---|
AVG() |
Aritmetický průměr |
SUM() |
Součet |
COUNT() |
Počet |
MIN() |
Minimum |
MAX() |
Maximum |
- Uvnitř závorek se předpokládá použití některého z polí z tabulky, popř. hvězdička (*), reprezentující celý řádek.
- Povolené jsou také výrazy z názvů polí i literálů, interních a uživatelských funkcí.
- Naopak, většina databází jako parametr agregační funkce nepodporuje poddotazy
COUNT
[editovat | editovat zdroj]Funkce COUNT()
se od ostatních agregačních funkcí v několika věcech odlišuje:
- Zatímco ostatní svůj výsledek vrací nad specifikovanými sloupci nebo výrazy z nich,
COUNT()
vrací počet záznamů, které vyhovují zadané podmínce resp. seskupení, a proto je jedno, který ze sloupců má jako argument (a často se používá hvězdičková konvence). - Výjimkou výše uvedeného bodu je případ, kdy je potřeba vrátit počet unikátních hodnot určitého sloupce použitého v tabulce. Pak se ke
COUNT()
přidává klíčové slovoDISTINCT
:
Příklad:
SELECT COUNT(DISTINCT zeme) FROM navstevnici;
-- Z kolika zemí přicházejí návštěvníci?
- V případech, že nebyl nalezen ani jeden odpovídající řádek,
COUNT()
vrátí nulu (ostatní agregační funkce vrací hodnotu NULL). COUNT()
může být v SQL voláno bez konstrukce GROUP BY. Touto výjimkou je SQL dotaz nad celou tabulkou (např. dotaz na maximální hodnotu určitého sloupce z celé tabulky), který vrací toliko jeden řádek:
SELECT COUNT(*) FROM zamestnanci;
-- Vrať počet řádků v tabulce `zamestnanci`.
Některé databázové systémy mají počet položek svých tabulek uloženy zvlášť, takže pokud není dotaz tohoto typu nijak dále omezen (jako ve výše uvedeném příkladu), „sáhnou“ si pro výsledek do informací o tabulce a k jejímu procházení vůbec nedojde (což se pozitivně projeví na rychlosti a zátěži na paměťové médium).
SUM
[editovat | editovat zdroj]Funkce SUM()
vrací sumaci vybraných řádků. Je-li jejich počet nulový, je vrácena nikoli nula, ale hodnota NULL.
Pro SUM()
umožňuje řada databázových systémů použít také logické (pravdivostní) výrazy (z Booleovy algebry – např. výsledky rovnosti, nerovnosti, apod.), u kterých vrací jedničku pro „pravdu“ a nulu pro „nepravdu“. Takto lze zjistit počet řádků v tabulce, jejichž prvky splňují zadanou podmínku.
GROUP_CONCAT
[editovat | editovat zdroj]GROUP_CONCAT()
je speciální agregační funkce, kterou nabízejí některé databázové systémy (mezi nimi například MySQL). Jejím výsledkem je nikoli počet ale výčet nalezených hodnot, oddělených čárkou nebo jiným oddělovačem. Pro různé číselníky apod. tak může být GROUP_CONCAT()
velice užitečná – bez ní by bylo potřeba hodnoty vybrat jiným SQL dotazem, výsledek projít záznam po záznamu a hodnoty zapsat jednu za druhou do pomocné řetězcové proměnné. U příliš obsáhlých tabulek může ovšem výsledek přesahovat maximum toho, co databázový systém může vrátit, a je třeba na to dávat pozor. Jako u COUNT()
i u této funkce lze GROUP_CONCAT()
kombinovat s klíčovým slovem DISTINCT
pro eliminaci vícekrát se vyskytujících hodnot. Navíc lze výčet seřadit (vložením klauzule ORDER BY
) a též si přizpůsobit formát výpisu specifikováním jiného oddělovače než výchozí čárky (uvedeným v klauzuli SEPARATOR
).
Příklad:
SELECT student_name,
GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ')
FROM student
GROUP BY student_name;
-- Z tabulky studentů vypíše jméno a unikátní skóre, seřazené sestupně, oddělené mezerou.
HAVING
[editovat | editovat zdroj]Konstrukce HAVING
, za kterou následují omezující podmínky, umožňuje omezit řádky, které jsou zpracovány agregační funkcí. Je tedy možné ji použít jako náhradu za konstrukci WHERE
, kde agregační funkce nejsou povoleny. Návrh SQL používá dvě různé konstrukce pro omezující podmínky podle přítomnosti agregačních funkcí proto, že agregovaný výběr se od toho běžného liší (použitím rozdílných postupů, algoritmů, výkonem, atd.). Omezující podmínky konstrukce HAVING
obsahující alespoň jednu agregační funkci musejí být uvedeny až za GROUP BY
.
Syntaxe HAVING:
SELECT zeme, COUNT(*) AS Pocet
FROM zamestnanci
GROUP BY zeme
HAVING COUNT(*)>1
Časté chyby: Záměna HAVING A WHERE
Často dochází k zámeně konstrukcí HAVING
a WHERE
a agregační funkce je napsána do WHERE
. Podívejme se na následující skript:
SELECT zeme, COUNT(*) AS Pocet
FROM zamestnanci
WHERE COUNT(*)>1
GROUP BY zeme
Výsledkem skriptu bude chyba. Důvodem je logické zpracování dotazu (tzv. logical query prosessing), kdy je konstrukce WHERE
zpracována dříve než GROUP BY
. Snažíme se tedy seskupit řádky na základě agregační funkce, která ještě není spočítána.[1]
Agregační funkce a NULL
[editovat | editovat zdroj]- Hodnota NULL je absorpční prvek pro statistické agregační funkce jako
Min(), Max(), Avg()
, a další. To znamená, že pokud se ve výběru, ze kterého se agregační funkce počítá, vyskytne NULL, výsledek je pak vždy NULL. - Pro funkci
Count()
je důležitý počet řádků, nikoli, zdali hodnota jejího parametru nabývá NULL, vrací tedy vždy číslo. - Agregační funkce s výjimkou
Count()
vracejí NULL, pokud počet řádků, které pro ně byl vybrán, je nulový. - NULL se objevuje i na pozici agregovaného sloupce nebo výrazu v dotazu s konstrukcí
GROUP BY (výraz) WITH ROLLUP
, kde NULL reprezentuje všechny předtím vybrané případy dohromady
Reference
[editovat | editovat zdroj]Externí odkazy
[editovat | editovat zdroj]- SQL dotazy s agregací, interval.cz
- SQL - Co jsou to ty agregace?, Živě.cz
- Agregační funkce Archivováno 1. 8. 2008 na Wayback Machine. pro MySQL (anglicky)
- Rozdíl mezi HAVING a WHERE klauzulí