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).

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ů.

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).

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 výrazně liší (co do výkonu, zapojení složitějších algoritmů, atd.).

Externí odkazy[editovat | editovat zdroj]