sql >> Database teknologi >  >> RDS >> Mysql

AVG() – Beregn den gennemsnitlige værdi af en kolonne i MySQL

Når du bruger MySQL, kan du bruge AVG() funktion til at beregne gennemsnitsværdien ud fra en række værdier.

For eksempel kan du bruge denne funktion til at finde ud af, hvad den gennemsnitlige bybefolkning er for et givet land eller stat. Da et land vil have mange byer, hver med forskellige befolkninger, kan du finde ud af, hvad gennemsnittet er mellem dem. En by kan have en befolkning på f.eks. 50.000, mens en anden har en befolkning på 500.000. AVG() funktion vil beregne gennemsnittet for dig.

Syntaks

Syntaksen for AVG() går sådan her:

AVG([DISTINCT] expr) [over_clause]

Hvor expr er det udtryk, du ønsker gennemsnittet for.

 over_clause er en valgfri klausul, der fungerer med vinduesfunktioner. Den måde, vinduesfunktioner fungerer på, er, at der for hver række fra en forespørgsel udføres en beregning ved hjælp af rækker relateret til den pågældende række. I dette tilfælde er over_clause specificerer, hvordan forespørgselsrækker opdeles i grupper til behandling af vinduesfunktionen. Bemærk, at over_clause kan kun bruges, hvis du ikke bruger DISTINCT søgeord.

Rådata

For det første, her er de rå data, som vi vil bruge til eksemplerne på denne side:

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æggende eksempel

Som du kan se fra de rå data ovenfor, har nogle "distrikter" mere end én by, og hver by har en anden befolkning. Vi kan bruge AVG() funktion til at finde den gennemsnitlige befolkning i byerne inden for hvert 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, at New South Wales har en gennemsnitlig bybefolkning på 998487.2500.

Afrunding af gennemsnittet

Du har sikkert bemærket, at resultatet fra det forrige eksempel var ret præcist - det returnerede et resultat til fire decimaler. I vores tilfælde er det nok lidt for meget. Vi behøver ikke et resultat med fjerde decimal. Derfor kan vi bruge ROUND() funktion til at afrunde det til nærmeste hele tal (eller til et bestemt antal decimaler, hvis vi ønsker det).

Her er et eksempel på afrunding af resultatet til nærmeste hele tal:

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 er ROUND() funktion afrunder til nærmeste hele tal. Alternativt kunne vi have givet et andet argument til at angive et antal decimaler, men i dette tilfælde ønsker vi det ikke.

GROUP BY-klausulen

Vi kan bruge GROUP BY klausul for at angive hver distrikt/stat sammen med deres gennemsnitlige bybefolkning:

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 også bruge ORDER BY klausul for at specificere en kolonne, der skal bestilles 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 |
+-----------------+--------------------+

Bemærk, at når du bestiller efter et alias med flere ord (som `Average Population` ), skal du bruge backtick-tegnet (` ) i stedet for apostrof (' ) for at omgive de to ord.

Find den gennemsnitlige tegnlængde

AVG() funktion er ikke begrænset til kun kolonner med numeriske data. Du kan også kombinere AVG() med andre funktioner for at finde gennemsnit i andre områder.

Ved at bruge vores eksempeldata kan vi f.eks. finde den gennemsnitlige tegnlængde for alle værdierne i City kolonne:

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

Brug af en OVER-klausul

Som nævnt tillader syntaksen en OVER klausul, der skal inkluderes i dine forespørgsler. Dette kan blive lidt komplekst, men grundlæggende er OVER klausul giver dig mulighed for at specificere, hvordan du opdeler forespørgselsrækker i grupper til behandling af vinduesfunktionen.

Her er et eksempel:

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

Dette eksempel opdeler rækkerne efter District , der giver gennemsnittet for hver partition (distrikt). Dette giver dig mulighed for at se mere detaljerede data, såsom bybefolkningen, sammen med den gennemsnitlige befolkning for det distrikt, det hører hjemme i.


  1. Kan vi have flere MED AS i enkelt sql - Oracle SQL

  2. Hvad er MariaDB Enterprise, og hvordan administreres det med ClusterControl?

  3. Efterfølgende nul

  4. Brug af SQL til at bestemme ordtællingsstatistikker for et tekstfelt