sql >> Databáze >  >> RDS >> Mysql

AVG() – Výpočet průměrné hodnoty sloupce v MySQL

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ří.


  1. Proč SQL Server ztrácí milisekundu?

  2. Škodlivé, všudypřítomné mýty o výkonu serveru SQL

  3. Nelze použít připojení MySQL pro rámec entity 6

  4. SQL Server:Selhání komunikačního spojení Požadováno SSL (nepodařilo se přijmout paket)