Při používání MySQL můžete použít AVG()
funkce pro výpočet průměrné hodnoty z rozsahu hodnot.
Pomocí této funkce můžete například zjistit, jaký je průměrný počet obyvatel města pro danou zemi nebo stát. Vzhledem k tomu, že země bude mít mnoho měst, každé s jiným počtem obyvatel, můžete zjistit, jaký je mezi nimi průměr. Jedno město může mít řekněme 50 000 obyvatel, zatímco jiné má 500 000 obyvatel. AVG()
funkce vypočítá průměr za vás.
Syntaxe
Syntaxe AVG()
vypadá takto:
AVG([DISTINCT] expr) [over_clause]
Kde expr
je výraz, pro který chcete průměr.
over_clause
je volitelná klauzule, která pracuje s funkcemi okna. Funkce okna fungují tak, že pro každý řádek z dotazu se provede výpočet pomocí řádků souvisejících s tímto řádkem. V tomto případě over_clause
určuje, jak rozdělit řádky dotazu do skupin pro zpracování funkcí okna. Všimněte si, že over_clause
lze použít pouze v případě, že nepoužíváte DISTINCT
klíčové slovo.
Nezpracovaná data
Nejprve jsou zde nezpracovaná data, která použijeme pro příklady na této stránce:
SELECT Name, District, Population FROM City WHERE CountryCode = 'AUS';
Výsledek:
+---------------+-----------------+------------+ | Name | District | Population | +---------------+-----------------+------------+ | Sydney | New South Wales | 3276207 | | Melbourne | Victoria | 2865329 | | Brisbane | Queensland | 1291117 | | Perth | West Australia | 1096829 | | Adelaide | South Australia | 978100 | | Canberra | Capital Region | 322723 | | Gold Coast | Queensland | 311932 | | Newcastle | New South Wales | 270324 | | Central Coast | New South Wales | 227657 | | Wollongong | New South Wales | 219761 | | Hobart | Tasmania | 126118 | | Geelong | Victoria | 125382 | | Townsville | Queensland | 109914 | | Cairns | Queensland | 92273 | +---------------+-----------------+------------+
Základní příklad
Jak můžete vidět z nezpracovaných údajů výše, některé „okresy“ mají více než jedno město a každé město má jinou populaci. Můžeme použít AVG()
funkce k nalezení průměrného počtu obyvatel měst v každém okrese:
SELECT District, AVG(Population) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Výsledek:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487.2500 | +-----------------+--------------------+
Můžeme tedy vidět, že Nový Jižní Wales má průměrnou populaci města 998487,2500.
Zaokrouhlení průměru
Pravděpodobně jste si všimli, že výsledek z předchozího příkladu byl docela přesný – vrátil výsledek na čtyři desetinná místa. V našem případě je to asi trochu moc. Nepotřebujeme výsledek na čtvrté desetinné místo. Proto můžeme použít ROUND()
funkci zaokrouhlit na nejbližší celé číslo (nebo na zadaný počet desetinných míst, pokud si to přejeme).
Zde je příklad zaokrouhlení výsledku na nejbližší celé číslo:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Výsledek:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | +-----------------+--------------------+
Ve výchozím nastavení ROUND()
funkce zaokrouhlí na nejbližší celé číslo. Případně jsme mohli poskytnout 2. argument pro určení počtu desetinných míst, ale v tomto případě to nechceme.
Klauzule GROUP BY
Můžeme použít GROUP BY
klauzule k vypsání každého okresu/státu spolu s průměrným počtem obyvatel města:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Výsledek:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | | Victoria | 1495356 | | Queensland | 451309 | | West Australia | 1096829 | | South Australia | 978100 | | Capital Region | 322723 | | Tasmania | 126118 | +-----------------+--------------------+
Ustanovení ORDER BY
Můžeme také použít ORDER BY
klauzule k určení sloupce, se kterým se má seřadit podle:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Average Population`;
Výsledek:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | Tasmania | 126118 | | Capital Region | 322723 | | Queensland | 451309 | | South Australia | 978100 | | New South Wales | 998487 | | West Australia | 1096829 | | Victoria | 1495356 | +-----------------+--------------------+
Pamatujte, že při objednávání pomocí víceslovného aliasu (např. `Average Population`
), musíte použít znak zpětného zaškrtnutí (`
) namísto apostrofu ('
) k ohraničení dvou slov.
Najděte průměrnou délku znaků
AVG()
funkce není omezena pouze na sloupce s číselnými údaji. Můžete také kombinovat AVG()
s dalšími funkcemi k nalezení průměrů v jiných oblastech.
Například pomocí našich ukázkových dat můžeme zjistit průměrnou délku znaků všech hodnot v City
sloupec:
SELECT ROUND(AVG(CHAR_LENGTH(Name))) AS 'Average Character Length' FROM city WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Výsledek:
+--------------------------+ | Average Character Length | +--------------------------+ | 10 | +--------------------------+
Použití klauzule OVER
Jak již bylo zmíněno, syntaxe umožňuje OVER
klauzule, která má být zahrnuta do vašich dotazů. To může být trochu složité, ale v zásadě OVER
klauzule umožňuje určit, jak rozdělit řádky dotazu do skupin pro zpracování funkcí okna.
Zde je příklad:
SELECT District, Name AS City, Population, ROUND(AVG(Population) OVER(PARTITION BY District)) AS 'District Avg' FROM City WHERE CountryCode = 'AUS' ORDER BY District;
Výsledek:
+-----------------+---------------+------------+--------------+ | District | City | Population | District Avg | +-----------------+---------------+------------+--------------+ | Capital Region | Canberra | 322723 | 322723 | | New South Wales | Sydney | 3276207 | 998487 | | New South Wales | Wollongong | 219761 | 998487 | | New South Wales | Newcastle | 270324 | 998487 | | New South Wales | Central Coast | 227657 | 998487 | | Queensland | Townsville | 109914 | 451309 | | Queensland | Brisbane | 1291117 | 451309 | | Queensland | Cairns | 92273 | 451309 | | Queensland | Gold Coast | 311932 | 451309 | | South Australia | Adelaide | 978100 | 978100 | | Tasmania | Hobart | 126118 | 126118 | | Victoria | Melbourne | 2865329 | 1495356 | | Victoria | Geelong | 125382 | 1495356 | | West Australia | Perth | 1096829 | 1096829 | +-----------------+---------------+------------+--------------+
Tento příklad rozděluje řádky podle District
, poskytující průměr pro každý oddíl (okres). To vám umožní zobrazit podrobnější údaje, jako je počet obyvatel města, spolu s průměrným počtem obyvatel okresu, do kterého patří.