Mysql
 sql >> Base de données >  >> RDS >> Mysql

AVG() - Calculer la valeur moyenne d'une colonne dans MySQL

Lorsque vous utilisez MySQL, vous pouvez utiliser le AVG() fonction pour calculer la valeur moyenne à partir d'une plage de valeurs.

Par exemple, vous pouvez utiliser cette fonction pour connaître la population urbaine moyenne d'un pays ou d'un état donné. Étant donné qu'un pays aura de nombreuses villes, chacune avec des populations différentes, vous pouvez découvrir quelle est la moyenne entre elles. Une ville peut avoir une population de, disons, 50 000 habitants tandis qu'une autre a une population de 500 000 habitants. Le AVG() calculera la moyenne pour vous.

Syntaxe

La syntaxe de AVG() va comme ceci :

AVG([DISTINCT] expr) [over_clause]

expr est l'expression pour laquelle vous voulez la moyenne.

La over_clause est une clause facultative qui fonctionne avec les fonctions de fenêtre. La façon dont les fonctions de fenêtre fonctionnent est que, pour chaque ligne d'une requête, effectuez un calcul en utilisant les lignes liées à cette ligne. Dans ce cas, la over_clause spécifie comment partitionner les lignes de requête en groupes pour le traitement par la fonction de fenêtre. Notez que la over_clause ne peut être utilisé que si vous n'utilisez pas le DISTINCT mot-clé.

Données brutes

Tout d'abord, voici les données brutes que nous utiliserons pour les exemples de cette page :

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

Résultat :

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

Exemple de base

Comme vous pouvez le voir à partir des données brutes ci-dessus, certains « districts » ont plus d'une ville, et chaque ville a une population différente. Nous pouvons utiliser le AVG() fonction pour trouver la population moyenne des villes de chaque arrondissement :

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

Résultat :

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

Nous pouvons donc voir que la Nouvelle-Galles du Sud a une population urbaine moyenne de 998487,2500.

Arrondir la moyenne

Vous avez probablement remarqué que le résultat de l'exemple précédent était assez précis - il renvoyait un résultat à quatre décimales. Dans notre cas, c'est probablement un peu trop. Nous n'avons pas besoin d'un résultat à la quatrième décimale. Par conséquent, nous pouvons utiliser le ROUND() pour l'arrondir au nombre entier le plus proche (ou à un nombre spécifié de décimales si nous le souhaitons).

Voici un exemple d'arrondi du résultat au nombre entier le plus proche :

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

Résultat :

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

Par défaut, le ROUND() fonction arrondit au nombre entier le plus proche. Alternativement, nous aurions pu fournir un deuxième argument pour spécifier un nombre de décimales, mais dans ce cas, nous ne le voulons pas.

La clause GROUP BY

Nous pouvons utiliser le GROUP BY clause pour répertorier chaque district/état, ainsi que la population moyenne de leur ville :

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

Résultat :

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

La clause ORDER BY

Nous pouvons également utiliser le ORDER BY clause pour spécifier une colonne avec laquelle ordonner par :

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

Résultat :

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

Notez que, lors de la commande par un alias de plusieurs mots (comme `Average Population` ), vous devez utiliser le caractère backtick (` ) au lieu de l'apostrophe (' ) pour entourer les deux mots.

Trouvez la longueur moyenne des caractères

Le AVG() La fonction n'est pas limitée aux seules colonnes avec des données numériques. Vous pouvez également combiner AVG() avec d'autres fonctions pour trouver des moyennes dans d'autres domaines.

Par exemple, en utilisant nos exemples de données, nous pouvons trouver la longueur moyenne des caractères de toutes les valeurs de City colonne :

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

Résultat :

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

Utiliser une clause OVER

Comme mentionné, la syntaxe permet un OVER clause à inclure dans vos requêtes. Cela peut devenir un peu complexe, mais fondamentalement, le OVER La clause vous permet de spécifier comment partitionner les lignes de requête en groupes pour le traitement par la fonction de fenêtre.

Voici un exemple :

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

Résultat :

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

Cet exemple partitionne les lignes par District , fournissant la moyenne pour chaque partition (district). Cela vous permet de voir des données plus granulaires, telles que la population de la ville, ainsi que la population moyenne du district auquel elle appartient.