sql >> Database >  >> RDS >> Mysql

AVG() – Bereken de gemiddelde waarde van een kolom in MySQL

Wanneer u MySQL gebruikt, kunt u de AVG() . gebruiken functie om de gemiddelde waarde uit een reeks waarden te berekenen.

U kunt deze functie bijvoorbeeld gebruiken om erachter te komen wat de gemiddelde stadsbevolking is voor een bepaald land of een bepaalde staat. Aangezien een land veel steden zal hebben, elk met verschillende bevolkingsgroepen, kun je erachter komen wat het gemiddelde tussen hen is. De ene stad heeft bijvoorbeeld 50.000 inwoners, terwijl de andere 500.000 inwoners heeft. De AVG() functie berekent het gemiddelde voor u.

Syntaxis

De syntaxis van AVG() gaat als volgt:

AVG([DISTINCT] expr) [over_clause]

Waar expr is de uitdrukking waarvoor u het gemiddelde wilt.

De over_clause is een optionele clausule die werkt met vensterfuncties. De manier waarop vensterfuncties werken, is dat voor elke rij van een query een berekening wordt uitgevoerd met rijen die aan die rij zijn gerelateerd. In dit geval is de over_clause specificeert hoe queryrijen in groepen moeten worden verdeeld voor verwerking door de vensterfunctie. Merk op dat de over_clause kan alleen worden gebruikt als u de DISTINCT . niet gebruikt zoekwoord.

Onbewerkte gegevens

Ten eerste zijn hier de onbewerkte gegevens die we zullen gebruiken voor de voorbeelden op deze pagina:

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

Resultaat:

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

Basisvoorbeeld

Zoals je kunt zien aan de hand van de ruwe gegevens hierboven, hebben sommige "districten" meer dan één stad en elke stad heeft een andere bevolking. We kunnen de AVG() . gebruiken functie om de gemiddelde bevolking van de steden binnen elk district te vinden:

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

Resultaat:

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

We kunnen dus zien dat New South Wales een gemiddelde stadsbevolking heeft van 998487.2500.

Het gemiddelde afronden

Je hebt waarschijnlijk gemerkt dat het resultaat van het vorige voorbeeld vrij nauwkeurig was - het gaf een resultaat terug tot op vier decimalen. In ons geval is dit waarschijnlijk een beetje te veel. We hebben geen resultaat tot op de vierde decimaal nodig. Daarom kunnen we de ROUND() . gebruiken functie om het af te ronden op het dichtstbijzijnde gehele getal (of op een bepaald aantal decimalen als we dat willen).

Hier is een voorbeeld van het afronden van het resultaat op het dichtstbijzijnde gehele getal:

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

Resultaat:

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

Standaard is de ROUND() functie rondt af op het dichtstbijzijnde gehele getal. Als alternatief hadden we een tweede argument kunnen geven om een ​​aantal decimalen op te geven, maar in dit geval willen we dat niet.

De GROUP BY-clausule

We kunnen de GROUP BY . gebruiken clausule om elk district/staat op te sommen, samen met hun gemiddelde stadsbevolking:

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

Resultaat:

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

De ORDER BY-clausule

We kunnen ook de ORDER BY . gebruiken clausule om een ​​kolom op te geven waarmee besteld kan worden op:

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

Resultaat:

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

Houd er rekening mee dat wanneer u bestelt met een alias met meerdere woorden (zoals `Average Population` ), moet u het backtick-teken gebruiken (` ) in plaats van de apostrof (' ) om de twee woorden te omringen.

Vind de gemiddelde tekenlengte

De AVG() functie is niet beperkt tot alleen kolommen met numerieke gegevens. Je kunt ook AVG() . combineren met andere functies om gemiddelden in andere gebieden te vinden.

Met behulp van onze voorbeeldgegevens kunnen we bijvoorbeeld de gemiddelde tekenlengte vinden van alle waarden in de City kolom:

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

Resultaat:

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

Een OVER-clausule gebruiken

Zoals vermeld, staat de syntaxis een OVER . toe clausule die in uw vragen moet worden opgenomen. Dit kan enigszins ingewikkeld worden, maar in feite is de OVER clausule kunt u specificeren hoe queryrijen in groepen moeten worden verdeeld voor verwerking door de vensterfunctie.

Hier is een voorbeeld:

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

Resultaat:

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

Dit voorbeeld verdeelt de rijen op District , met het gemiddelde voor elke partitie (district). Hierdoor kunt u gedetailleerdere gegevens zien, zoals de stadsbevolking, samen met de gemiddelde bevolking voor het district waartoe het behoort.


  1. Wanneer is het beter om vlaggen als bitmasker op te slaan in plaats van een associatieve tabel te gebruiken?

  2. Houd je niet van database-triggers? Je weet gewoon niet hoe je met ze moet werken!

  3. Hoe BLOB- en CLOB-bestanden in MySQL in te voegen?

  4. JSON_TYPE() - Krijg een JSON-waardetype in MySQL