Retour à la liste des articles Articles
8 minutes de lecture

La fonction SQL AVG() expliquée avec des exemples

Nous expliquons la fonction SQL AVG() à l'aide d'exemples pratiques, en précisant où et comment vous pouvez l'utiliser.

La moyenne est probablement l'une des métriques les plus utilisées pour décrire certaines caractéristiques d'un groupe. Elle est si polyvalente et utile qu'elle peut décrire quelque chose sur presque tout.

Si vous aimez le sport, vous voyez des choses comme la moyenne de courses par match au baseball, la moyenne de passes décisives par match ou par saison au basketball, etc. Tous les jours, vous entendez des déclarations comme "en moyenne, il pleut 10 jours par mois dans cette ville" ou "la température reste supérieure à 70 degrés en moyenne pendant l'été".

Dans cet article, je vais couvrir l'utilisation de la fonction SQL AVG() avec quelques exemples concrets pour vous aider à en faire bon usage dans des situations pratiques. Lisez-le !

Que fait la fonction SQL AVG() ?

La fonction SQL AVG() est utilisée pour trouver la moyenne des valeurs des enregistrements d'une table.

Pour le comprendre à l'aide d'un exemple, considérez la table suivante qui contient des enregistrements d'employés.

employees

employeenumberlastnameskill_levelannual_salarydepartment
1056Patterson1010000Finance
1076Firrelli10NULLMarketing
1088Patterson6012500Finance
1102Bondur2110000Human Resources
1143Bow105000Sales
1165Jennings105000Sales
1166Thompson1010000Marketing

Exemple 1

Supposons que vous souhaitiez connaître le niveau de compétence moyen des employés. Vous pouvez utiliser la fonction SQL AVG(). Voici la requête :

SELECT AVG(skill_level)
FROM employees;

Voici le résultat :

AVG(skill_level)
18.714285714285715

La fonction AVG() prend un nom de colonne comme argument (également appelé opérande) et calcule ensuite la moyenne de toutes les valeurs de la colonne. Ainsi, dans ce cas, notre requête renvoie la moyenne de toutes les valeurs de la colonne skill_level.

Vous remarquerez peut-être que le résultat est affiché avec de nombreuses décimales. Comme vous avez rarement besoin d'une telle précision, vous pouvez arrondir ce nombre au nombre entier le plus proche. Vous pouvez utiliser AVG() imbriqué dans d'autres fonctions SQL comme ROUND(), comme ceci :

SELECT ROUND(AVG(skill_level))
FROM employees;

Le résultat ressemble maintenant à ceci :

AVG(skill_level)
19

La fonction entre parenthèses est évaluée en premier. Ainsi, la requête calcule d'abord la moyenne, puis arrondit le résultat pour obtenir la valeur 19.

Exemple 2

Dans l'exemple ci-dessus, nous avons utilisé AVG() dans la partie SELECT de la requête. Voyons d'autres exemples de requêtes SQL AVG().

Supposons que vous vouliez obtenir une liste des employés dont le salaire est supérieur à la moyenne de l'entreprise. Si vous êtes novice en SQL, votre premier réflexe sera peut-être d'écrire quelque chose comme ceci :

SELECT lastname
FROM   employees
WHERE  annual_salary > AVG(annual_salary);

Lorsque vous l'exécutez, elle produit quelque chose comme ceci :

ERROR 1111 (HY000): Invalid use of group function

Cette requête génère une erreur, car vous ne pouvez pas utiliser AVG() dans une condition WHERE. Comme AVG() est une fonction de groupe, vous ne pouvez l'utiliser que dans une déclaration SELECT ou dans une clause HAVING.

À la place, exécutez la requête suivante :

SELECT   lastname, annual_salary
FROM     employees
WHERE    annual_salary > (SELECT AVG(annual_salary)
		 		    FROM employees);

Voici le résultat :

lastnameannual_salary
Patterson10000
Patterson12500
Bondur10000
Thompson10000

La requête à l'intérieur d'une requête principale s'appelle une sous-requête. Ici, nous utilisons d'abord une sous-requête (mise en évidence ci-dessous) pour obtenir la valeur moyenne de annual_salary à partir de la table employees tableau. Nous la comparons ensuite à chaque valeur de la colonne pour obtenir le résultat.

SELECT  lastname, annual_salary
FROM    employees
WHERE   annual_salary > (SELECT AVG(annual_salary)
				 FROM employees);

Vous voyez quelque chose d'intéressant ?

Il existe un enregistrement dans notre table avec une valeur NULL dans annual_salary, mais notre requête n'a pas généré d'erreur. Cela est dû au fait que la fonction SQL AVG() ignore NULLs et calcule simplement la moyenne des autres enregistrements avec des valeurs numériques. Autrement dit, elle ignore la valeur de la ligne indiquée ci-dessous.

employeenumberlastnameskill_levelannual_salarydepartment
1076Firrelli10NULLMarketing

AVG() avec une clause DISTINCT

Imaginez que vous ayez des données dupliquées dans vos tables, et que vous souhaitiez ignorer les valeurs dupliquées lors du calcul de la moyenne.

Pour faire cela en SQL, vous devez utiliser une clause DISTINCT. Vous pouvez voir que la colonne annual_salary de notre table employees a des valeurs qui se répètent, par exemple 5000 et 10000. Si nous voulons que SQL ne considère ces valeurs qu'une seule fois, nous utilisons AVG() avec une clause DISTINCT.

Voici comment les résultats diffèrent :

QueryResult
SELECT AVG(annual_salary) FROM employees;8750.00
SELECT AVG(DISTINCT annual_salary) FROM employees;9166.667

Dans le premier cas, la valeur 10 000 a été incluse trois fois, et la valeur 5 000 a été incluse deux fois. Dans le second cas, ces valeurs n'ont été comptées qu'une seule fois chacune, d'où la différence dans les résultats.

Fonctions d'agrégation

AVG() appartient à une classe de fonctions connues sous le nom de fonctions agrégées. Une fonction d'agrégation renvoie un seul résultat calculé sur plusieurs lignes.

Ces fonctions sont extrêmement importantes pour l'analyse. Il est souvent impossible de passer en revue chaque enregistrement pour recueillir des informations à partir d'une table qui peut contenir des millions de lignes. Vous devez donc regrouper ces millions de lignes en groupes significatifs.

Par exemple, disons que vous travaillez chez Facebook et que vous voulez savoir quelles tranches d'âge passent le plus de temps sur votre application. Dans ce cas, vous créez des groupes/segments de différents groupes d'âge, puis vous trouvez le temps moyen passé pour chaque groupe.

Voici quelques-unes des autres fonctions d'agrégation, chacune accompagnée d'un exemple d'utilisation :

Aggregate FunctionExample Use Case
SUM()Find the sum of salaries by department.
COUNT()Find the number of employees in each department.
MAX()Find the highest salary paid in each department.
MIN()Find the lowest salary paid in each department.
AVG()Find the average salary for each department.

Si ce n'est pas très clair pour vous pour le moment, ne vous inquiétez pas. Je vous propose quelques bons exemples SQL AVG() .

La fonction SQL AVG() avec une clause GROUP BY

Pour montrer comment AVG() fonctionne en pratique en tant que fonction d'agrégation, laissez-moi vous expliquer comment utiliser AVG() avec une clause GROUP BY.

La clause SQL GROUP BY est utilisée pour regrouper des lignes. Dans la plupart des cas, une clause GROUP BY comporte une ou plusieurs fonctions d'agrégation qui calculent une ou plusieurs métriques pour le groupe.

Exemple 3

Imaginez que vous travaillez en tant qu'analyste dans l'équipe de rémunération d'une entreprise. Vous souhaitez connaître le salaire moyen des employés par département. Pour ce faire, vous pouvez utiliser une clause GROUP BY avec AVG() comme ceci :

SELECT     department,
	      AVG(annual_salary)
FROM       employees
GROUP BY   department;

Voici le résultat de cette requête :

departmentAVG(annual_salary)
Finance11250.00
Marketing10000.00
Human Resources10000.00
Sales5000.00

Elle regroupe tous les enregistrements par département puis calcule la moyenne annual_salary pour chaque département.

Exemple 4

Si vous travaillez dans une grande entreprise comportant de nombreux départements, vous souhaitez peut-être vous concentrer sur les départements dont le salaire moyen est supérieur à une valeur spécifique. Pour ce faire, vous devez filtrer certains groupes dans le résultat de votre requête.

Disons que vous voulez trouver les départements dont le salaire moyen est supérieur à 10 000. Votre requête ressemble à ceci :

SELECT     department,
	      AVG(annual_salary)
FROM       employees
GROUP BY   department
HAVING     AVG(annual_salary) > 10000;

Voici le résultat de cette requête :

departmentAVG(annual_salary)
Finance11250.00

Puisque seul le département Finance a le salaire moyen supérieur à 10000, il est la seule ligne retournée.

Pour en savoir plus sur la façon de filtrer les enregistrements avec les fonctions d'agrégation, lisez cet article.

Il n'est pas nécessaire d'avoir AVG() dans l'instruction SELECT pour l'utiliser dans une clause HAVING. Par exemple, la requête suivante vous donne uniquement le nom du département dans le résultat :

SELECT      department
FROM        employees
GROUP BY    department
HAVING      AVG(annual_salary) > 10000;

Et le résultat :

department
Finance

La fonction SQL AVG() avec une instruction CASE

Vous pouvez également utiliser AVG() avec une instruction CASE. Si vous n'êtes pas familier avec CASE, jetez un coup d'œil à cet article.

Exemple 5

Supposons que vous souhaitiez afficher "High" comme catégorie lorsque le salaire moyen est supérieur à 7 000, et "Low" s'il est égal ou inférieur. Voici à quoi ressemble la requête :

SELECT department,
	   CASE WHEN AVG(annual_salary) > 7000 THEN 'High'
	   ELSE 'Low' END as category
FROM employees
GROUP BY department;

Le résultat de cette requête :

departmentcategory
FinanceHigh
MarketingHigh
Human ResourceHigh
SalesLow

La moyenne est calculée pour chaque département puis comparée à 7000. Si le salaire moyen d'un département est supérieur à 7000, alors 'High' est retourné comme son category.

Quand ne pas utiliser AVG()

Bien qu'utile, la moyenne a ses limites en tant que métrique. Cela est particulièrement vrai lorsque les valeurs de votre ensemble de données sont très asymétriques.

Par exemple, disons que vous gérez une chaîne YouTube et que vous avez téléchargé 20 vidéos jusqu'à présent. L'une d'entre elles a atteint le million de vues, mais les autres n'ont pas encore été vues. Bien qu'il soit techniquement possible de calculer la moyenne, en réalité, une seule vidéo contribue à la moyenne de 200 000.

Lorsque les valeurs sont très asymétriques, la médiane est souvent une meilleure mesure. La médiane est la valeur située au 50e percentile d'une série, c'est-à-dire le point auquel la moitié des valeurs de la série ou du groupe sont inférieures et l'autre moitié supérieures.

Prêt à utiliser la fonction SQL AVG() dans vos requêtes ?

À présent, vous devriez avoir une bonne compréhension de la fonction SQL AVG() et des différentes façons de l'utiliser. Si vous débutez et souhaitez faire carrière dans le domaine des données, SQL est un outil indispensable.

Pour en savoir plus sur les fonctions standard comme AVG(), je vous recommande ce cours de LearnSQL.fr. Ce cours est merveilleusement conçu et renforce l'apprentissage tout au long de la formation pour vous aider à retenir ce que vous apprenez. Si vous êtes très enthousiaste à l'idée d'apprendre SQL de bout en bout, jetez un coup d'œil au cours SQL de A à Z.

Les clés pour devenir compétent en SQL sont la pratique et le fait de toujours rester à jour avec les développements et les nouvelles fonctionnalités. Continuez donc à lire les articles de LearnSQL.fr pour en savoir plus et connaître les dernières nouveautés en matière de SQL.

Bon apprentissage !