Agregační funkce

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Agregační funkce jsou v SQL statistické funkce, pomocí kterých systém řízení báze dat umožňuje seskupit vybrané řádky dotazu (získané příkazem SELECT) a spočítat nad nimi výsledek určité aritmetické nebo statistické funkce. Agregační funkce se v SQL používají s konstrukcí GROUP BY.

Agregace[editovat | editovat zdroj]

Při výběru řádků z tabulky (nebo tabulek) většina databázových strojů relačních databází 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é slovo DISTINCT:

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ž defaultní čá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]

Syntaktická konstrukce HAVING, za kterou následuje omezující podmínka, umožňuje omezit řádky, které se budou ve výsledku agregovat a u kterých se budou počítat výsledky agregačních funkcí. Na rozdíl od podmínek v klauzuli za WHERE, kde to není povoleno, dovoluje podmínka v klauzuli HAVING používat agregační funkce. Sloupce, které se objeví v agregačních funkcích za HAVING, musejí být uvedeny v sekci za GROUP BY. Návrh SQL používá dvě různé konstrukce pro omezující podmínky výběru podle výskytu či absence 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.).

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, zda-li 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ě vyl vybrán, je nulový.
  • NULL 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

Externí odkazy[editovat | editovat zdroj]