sql >> Databasteknik >  >> RDS >> Mysql

AVG() – Beräkna medelvärdet för en kolumn i MySQL

När du använder MySQL kan du använda AVG() funktion för att beräkna medelvärdet från ett värdeintervall.

Du kan till exempel använda den här funktionen för att ta reda på vad den genomsnittliga stadsbefolkningen är för ett visst land eller stat. Med tanke på att ett land kommer att ha många städer, var och en med olika befolkning, kan du ta reda på vad genomsnittet är mellan dem. En stad kan ha en befolkning på till exempel 50 000 medan en annan har en befolkning på 500 000. AVG() funktionen beräknar genomsnittet åt dig.

Syntax

Syntaxen för AVG() går så här:

AVG([DISTINCT] expr) [over_clause]

Där expr är uttrycket som du vill ha genomsnittet för.

 over_clause är en valfri klausul som fungerar med fönsterfunktioner. Sättet som fönsterfunktioner fungerar är att för varje rad från en fråga, utför en beräkning med rader relaterade till den raden. I det här fallet, over_clause anger hur man partitionerar frågerader i grupper för bearbetning av fönsterfunktionen. Observera att over_clause kan endast användas om du inte använder DISTINCT nyckelord.

Rådata

Först, här är rådata som vi kommer att använda för exemplen på den här sidan:

SELECT Name, District, Population
FROM City
WHERE CountryCode = 'AUS';

Resultat:

+---------------+-----------------+------------+
| 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 |
+---------------+-----------------+------------+

Grundläggande exempel

Som du kan se från rådata ovan har vissa "distrikt" mer än en stad, och varje stad har en annan befolkning. Vi kan använda AVG() funktion för att hitta den genomsnittliga befolkningen i städerna inom varje distrikt:

SELECT District, AVG(Population) AS 'Average Population'
FROM City
WHERE CountryCode = 'AUS'
AND District = 'New South Wales';

Resultat:

+-----------------+--------------------+
| District        | Average Population |
+-----------------+--------------------+
| New South Wales |        998487.2500 |
+-----------------+--------------------+

Så vi kan se att New South Wales har en genomsnittlig stadsbefolkning på 998487.2500.

Avrunda genomsnittet

Du har säkert märkt att resultatet från föregående exempel var ganska exakt – det gav ett resultat till fyra decimaler. I vårt fall är det nog lite för mycket. Vi behöver inte ett resultat med fjärde decimalen. Därför kan vi använda ROUND() funktion för att avrunda det till närmaste heltal (eller till ett specificerat antal decimaler om vi så önskar).

Här är ett exempel på avrundning av resultatet till närmaste heltal:

SELECT District, ROUND(AVG(Population)) AS 'Average Population'
FROM City
WHERE CountryCode = 'AUS'
AND District = 'New South Wales';

Resultat:

+-----------------+--------------------+
| District        | Average Population |
+-----------------+--------------------+
| New South Wales |             998487 |
+-----------------+--------------------+

Som standard är ROUND() funktion avrundar till närmaste heltal. Alternativt kunde vi ha tillhandahållit ett andra argument för att ange ett antal decimaler, men i det här fallet vill vi inte ha det.

GROUP BY-klausulen

Vi kan använda GROUP BY klausul för att lista ut varje distrikt/stat, tillsammans med deras genomsnittliga stadsbefolkning:

SELECT District, ROUND(AVG(Population)) AS 'Average Population'
FROM City
WHERE CountryCode = 'AUS'
GROUP BY District;

Resultat:

+-----------------+--------------------+
| District        | Average Population |
+-----------------+--------------------+
| New South Wales |             998487 |
| Victoria        |            1495356 |
| Queensland      |             451309 |
| West Australia  |            1096829 |
| South Australia |             978100 |
| Capital Region  |             322723 |
| Tasmania        |             126118 |
+-----------------+--------------------+

ORDER BY-klausulen

Vi kan också använda ORDER BY sats för att ange en kolumn som du kan beställa efter:

SELECT District, ROUND(AVG(Population)) AS 'Average Population'
FROM City
WHERE CountryCode = 'AUS'
GROUP BY District
ORDER BY `Average Population`;

Resultat:

+-----------------+--------------------+
| District        | Average Population |
+-----------------+--------------------+
| Tasmania        |             126118 |
| Capital Region  |             322723 |
| Queensland      |             451309 |
| South Australia |             978100 |
| New South Wales |             998487 |
| West Australia  |            1096829 |
| Victoria        |            1495356 |
+-----------------+--------------------+

Observera att när du beställer efter ett alias med flera ord (som `Average Population` ), måste du använda backteck-tecknet (` ) istället för apostrof (' ) för att omge de två orden.

Hitta den genomsnittliga teckenlängden

AVG() Funktionen är inte begränsad till bara kolumner med numeriska data. Du kan också kombinera AVG() med andra funktioner för att hitta medelvärden inom andra områden.

Med hjälp av våra exempeldata kan vi till exempel hitta den genomsnittliga teckenlängden för alla värden i City kolumn:

SELECT ROUND(AVG(CHAR_LENGTH(Name))) AS 'Average Character Length'
FROM city
WHERE CountryCode = 'AUS'
AND District = 'New South Wales';

Resultat:

+--------------------------+
| Average Character Length |
+--------------------------+
|                       10 |
+--------------------------+

Använda en OVER-klausul

Som nämnts tillåter syntaxen en OVER klausul som ska inkluderas i dina frågor. Det här kan bli lite komplicerat, men i princip OVER sats låter dig specificera hur du partitionerar frågerader i grupper för bearbetning av fönsterfunktionen.

Här är ett exempel:

SELECT 
    District,
    Name AS City,
    Population,
    ROUND(AVG(Population) OVER(PARTITION BY District)) AS 'District Avg'
FROM City
WHERE CountryCode = 'AUS'
ORDER BY District;

Resultat:

+-----------------+---------------+------------+--------------+
| 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 |
+-----------------+---------------+------------+--------------+

Det här exemplet delar upp raderna efter District , ger genomsnittet för varje partition (distrikt). Detta gör att du kan se mer detaljerad information, som stadens befolkning, tillsammans med den genomsnittliga befolkningen för det distrikt som den tillhör.


  1. ERD-notationer i datamodellering

  2. En introduktion till TimescaleDB

  3. SQL Self Join

  4. CBO Statistics White Paper