MySQL Agregační funkce: SUM, COUNT, AVG & MAX

⚡ Chytré shrnutí

Agregátní funkce v MySQL provést výpočet napříč mnoha řádky jednoho sloupce a vrátit jednu souhrnnou hodnotu. Pět standardních funkcí ISO – COUNT, SUM, AVG, MIN a MAX – jsou základem téměř každé sestavy, kterou databáze vytváří.

  • 🔢 Chování funkce POČET: Funkce COUNT(sloupec) ignoruje hodnoty NULL, zatímco funkce COUNT(*) počítá všechny řádky v tabulce, včetně duplikátů a hodnot NULL.
  • 🚫 DISTINCT klíčové slovo: Funkce DISTINCT odstraní duplicitní hodnoty před spuštěním výpočtu; výchozí je ALL a ty se zachovají.
  • 📉 MIN a MAX: Funkce MIN vrací nejmenší hodnotu ve sloupci a MAX vrací největší hodnotu, a to pro číselné, řetězcové i datové typy.
  • SUM a AVG: Oba operují pouze s číselnými sloupci a oba vylučují z vráceného výsledku řádky s hodnotou NULL.
  • 📊 SEKUPINY PODLE Párování: Přidáním příkazu GROUP BY se jeden souhrnný údaj změní na jeden souhrnný řádek na skupinu.
  • ⚠️ NULOVÁ past: AVG dělí se pouze počtem řádků, které nejsou NULL, takže chybějící hodnoty tiše zvyšují průměr.

Co jsou agregační funkce v MySQL?

An agregační funkce čte mnoho řádků z jednoho sloupce a sbaluje je do jedné hodnoty. Agregační funkce jsou o:

  • Provádění výpočtů na více řádcích
  • Z jednoho sloupce tabulky
  • A vrací jedinou hodnotu.

Norma ISO definuje pět (5) agregačních funkcí, a to:

  1. COUNT
  2. SOUČET
  3. AVG
  4. MIN
  5. MAX

Pro všech pět platí jedno pravidlo: Agregační funkce ignorují hodnoty NULLCOUNT(*) je jedinou výjimkou a níže se podíváme na proč.

Proč používat agregační funkce

Různé úrovně organizace mají různé požadavky na informace. Vrcholoví manažeři se obvykle zajímají o celá čísla, nikoli o jednotlivé detaily.

Agregační funkce nám umožňují snadno vytvářet souhrnná data z naší databáze.

Například z naší databáze myflix může management vyžadovat následující zprávy:

  • Nejméně vypůjčené filmy.
  • Nejpůjčovanější filmy.
  • Průměrný počet půjček každého filmu za měsíc.

Všechny výše uvedené sestavy pocházejí z agregačních funkcí. Pojďme se na každou z nich podívat podrobněji.

Funkce COUNT

Funkce COUNT vrací celkový počet hodnot v zadaném poli, a to jak číselných, tak nečíselných datových typů. Stejně jako každá agregační funkce, i funkce COUNT(column) vylučuje hodnoty NULL.

COUNT(*) je speciální forma, která vrací počet všech řádků v tabulce. Také počítá NULL a duplikáty, protože počítá řádky, nikoli hodnoty.

Tabulka movierentals obsahuje tato data:

referenční číslo Datum transakce datum návratu členské číslo movie_id film_ se vrátil
11 20-06-2012 NULL 1 1 0
12 22-06-2012 25-06-2012 1 2 0
13 22-06-2012 25-06-2012 3 2 0
14 21-06-2012 24-06-2012 2 2 0
15 23-06-2012 NULL 3 3 0

Předpokládejme, že chceme zjistit, kolikrát byl film s ID 2 vypůjčen.

SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;

Provedení tohoto v MySQL Workbench proti myflixdb vrací 3, protože tři řádky obsahují movie_id 2.

POČET(`id_filmu`)
3

DISTINCT Klíčové slovo

COUNT odpovídá na otázku „kolik“. Další otázkou je obvykle „kolik odlišný „ones“, a k tomu slouží DISTINCT.

DISTINCT Klíčové slovo

Klíčové slovo DISTINCT vynechává duplikáty z našich výsledků podle skupiny.ping stejné hodnoty dohromady, přesně jak naznačuje výše uvedený obrázek.

Nejprve provedeme jednoduchý dotaz.

SELECT `movie_id` FROM `movierentals`;
movie_id
1
2
2
2
3

Nyní stejný dotaz s klíčovým slovem DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

Funkce DISTINCT vynechává duplicitní záznamy:

movie_id
1
2
3

COUNT vs. COUNT(*) vs. COUNT(DISTINCT): Který z nich byste měli použít?

DISTINCT lze také umístit uvnitř agregační funkce, a právě zde většina začátečníků prohrává track z nichž řádků se skutečně počítají. Všechny čtyři níže uvedené formuláře běží na stejné pětiřádkové tabulce movierentals, která byla uvedena dříve, ale ne všechny vracejí stejné číslo. Rozdíl spočívá ve dvou otázkách: počítá formulář řádky nebo hodnoty a uchovává duplikáty?

Formulář Na čem záleží Výsledek na půjčovnách filmů
POČÍTAT(*) Každý řádek, včetně duplikátů a řádků, které jsou zcela NULL 5
POČET(`id_filmu`) Každá hodnota ve sloupci, která není NULL, včetně duplikátů 5
POČET(`datum_vrácení`) Pouze hodnoty jiné než NULL – dvě data návratu s hodnotou NULL se přeskočí. 3
POČET(DISTINCT `id_filmu`) Pouze unikátní hodnoty jiné než NULL 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Tip: Pro počet řádků použijte COUNT(*), pro počet sloupců COUNT(sloupec), pokud hodnota NULL znamená „neplatí“, a COUNT(DISTINCT sloupec) pro jedinečné hodnoty. Opakem DISTINCT je ALL – výchozí, a proto se vypisuje jen zřídka.

Funkce MIN

Funkce MIN vrátí nejmenší hodnotu v zadaném poli tabulky.

Předpokládejme, že chceme znát rok, ve kterém byl uveden nejstarší film v naší knihovně. MySQLTo nám dává funkce MIN.

SELECT MIN(`year_released`) FROM `movies`;

Výsledek:

MIN(`rok_vydání`)
2005

Funkce MAX

Jak již název napovídá, funkce MAX je opakem funkce MIN. To vrátí největší hodnotu ze zadaného pole tabulky.

Předpokládejme, že chceme rok vydání nejnovějšího filmu v naší databázi. Následující příklad ho vrátí.

SELECT MAX(`year_released`) FROM `movies`;

Výsledek:

MAX(`rok_vydání`)
2012

Funkce SUM

Funkce MIN a MAX vybírají existující hodnotu ze sloupce. Funkce SUM a AVG Vypočítejte nové číslo z celého sloupce.

Předpokládejme, že chceme znát celkovou částku dosud provedených plateb. MySQL SOUČET funkce vrací součet všech hodnot v zadaném sloupci. SUM funguje pouze na číselných polích, a Hodnoty NULL jsou z výsledku vyloučeny..

Následující tabulka zobrazuje data v tabulce plateb.

id_platby členské číslo datum splatnosti popis Částka vyplacená externí_ referenční _číslo
1 1 23-07-2012 Platba za pronájem filmu 2500 11
2 1 25-07-2012 Platba za pronájem filmu 2000 12
3 3 30-07-2012 Platba za pronájem filmu 6000 NULL

Dotaz zobrazený níže načte všechny provedené platby a sečte je do jednoho výsledku: 2500 + 2000 + 6000 = 10500.

SELECT SUM(`amount_paid`) FROM `payments`;

Výsledek:

SUM(`zaplacená_částka`)
10500

AVG funkce

Jedno MySQL AVG funkce vrátí průměr hodnot v zadaném sloupci. Stejně jako funkce SUM, to funguje pouze na číselných typech dat.

Předpokládejme, že chceme zjistit průměrnou zaplacenou částku. Můžeme použít následující dotaz, který vydělí součet 10500 třemi řádky plateb, které nemají hodnotu NULL.

SELECT AVG(`amount_paid`) FROM `payments`;

Výsledek:

AVG(`zaplacená_částka`)
3500

Warning️ Varování: AVG dělí se počtem řádků, které nejsou NULL, nikoli počtem řádků v tabulce. Hodnota NULL se přeskočí, místo aby se považovala za nulu, což nenápadně zvyšuje průměr. Použijte AVG(IFNULL(`zaplacená_částka`, 0)), pokud chybějící hodnota znamená nulu.

Praktický příklad: Kombinace agregačních funkcí s funkcí GROUP BY

Každá výše uvedená funkce vrátila jeden údaj pro celou tabulku. Přidání SKUPINA VYTVOŘENÁ klauzule vrací jednu číslici za skupinu místo toho – a tak se vytvářejí skutečné zprávy.

Následující příklad seskupí členy podle jména a poté spočítá celkový počet plateb, průměrnou výši platby a celkovou částku plateb pro každého člena.

SELECT m.`full_names`,
       COUNT(p.`payment_id`) AS `paymentscount`,
       AVG(p.`amount_paid`) AS `averagepaymentamount`,
       SUM(p.`amount_paid`) AS `totalpayments`
FROM members m, payments p
WHERE m.`membership_number` = p.`membership_number`
GROUP BY m.`full_names`;

Provedení výše uvedeného příkladu v MySQL Workbench nám dává následující výsledky.

AVG funkce používaná s GROUP BY

Dotaz spojuje obě tabulky v klauzuli WHERE – starším stylu spojení čárkou. Moderní kód zapisuje stejnou logiku jako explicitní VNITŘNÍ SPOJENÍ … ZAPNUTOVšimněte si také, že každý neagregovaný sloupec v seznamu SELECT se musí objevit ve skupině GROUP BY, nebo MySQL 5.7 a novější odmítají dotaz pod ONLY_FULL_GROUP_BY. Viz oficiální MySQL odkaz na agregační funkci.

Nejčastější dotazy

Jedno klauzule WHERE Funkce HAVING filtruje jednotlivé řádky před výpočtem agregace. Funkce HAVING následně filtruje seskupené výsledky, takže pouze funkce HAVING může odkazovat na agregaci, například COUNT(*) nebo SUM(zaplacená_částka).

Ano. Bez funkce GROUP BY agregační funkce považuje celou sadu výsledků za jednu skupinu a vrací přesně jeden řádek. Přidání funkce GROUP BY rozdělí výsledek do jednoho řádku pro každou odlišnou hodnotu skupiny.

Ano. Na rozdíl od SUM a AVGFunkce , MIN a MAX fungují na jakémkoli srovnatelném typu. V textovém sloupci vracejí abecedně první a poslední hodnotu a ve sloupci s datem nejstarší a nejnovější datum.

Ano. Asistenti pro převod textu do SQL překládají otázky jako „průměrná platba na člena“ do dotazu GROUP BY. Spusťte vygenerovaný SQL v MySQL Workbench a než se číslům budete důvěřovat, zkontrolujte počet řádků.

Obvyklou příčinou je zpracování hodnoty NULL a duplicitní spojení řádků. Model umělé inteligence může vybrat COUNT(*) tam, kde je potřeba COUNT(sloupec), nebo dvakrát spojit tabulku, což nafoukne každý SUM. Vždy ověřujte proti známé hodnotě.

Shrňte tento příspěvek takto: