Si t'as déjà essayé de calculer la moyenne des notes d'exam ou, genre, le salaire moyen dans un service, tu connais déjà le concept de moyenne arithmétique. Franchement, on apprend ça dès l'école. En SQL, tout ce qui touche au calcul de la moyenne dans un dataset, c'est la fonction AVG() qui s'en occupe.
La fonction AVG() c'est une fonction d'agrégation qui calcule la moyenne arithmétique d'une colonne numérique. Elle additionne toutes les valeurs de la colonne indiquée et divise le résultat par le nombre de ces valeurs. Elle ne fait pas attention aux NULL (et ce petit détail, bizarrement, nous simplifie la vie, mais on en reparle après).
Syntaxe de AVG()
On commence par la syntaxe de base :
SELECT AVG(colonne)
FROM table;
À noter : ici colonne c'est la colonne avec les valeurs numériques dont tu veux la moyenne.
Exemple 1 : Salaire moyen des employés
Imagine qu'on a une table employees avec les infos sur les employés et leurs salaires :
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | 60000 |
| 3 | Alex | 55000 |
| 4 | Anna | NULL |
| 5 | Dan | 52000 |
Une requête simple pour calculer le salaire moyen :
SELECT AVG(salary) AS average_salary
FROM employees;
Résultat :
| average_salary |
|---|
| 54250 |
Comment ça marche ?
AVG()additionne tous les salaires : 50000 + 60000 + 55000 + 52000 = 217000.- Elle divise la somme par le nombre de valeurs non nulles : 217000 / 4 = 54250.
Particularités de AVG() avec NULL
T'as sûrement remarqué que pour calculer la moyenne des salaires, la valeur NULL dans la colonne salary a été ignorée. C'est une feature clé de AVG(). Elle ne prend en compte que les valeurs non NULL.
Essayons un exemple :
SELECT AVG(NULL) AS result;
Résultat :
| result |
|---|
| NULL |
Encore une fois, ça montre que AVG() ignore les NULL. Mais si tout le dataset est composé de NULL, alors le résultat sera NULL.
Mais si dans la table on a 0 au lieu de NULL, ce résultat ne sera pas ignoré.
Table employees
| id | salary |
|---|---|
| 1 | 1000 |
| 2 | 0 |
| 3 | NULL |
| 4 | 2000 |
Requête SQL :
SELECT AVG(salary) AS avg_salary
FROM employees;
Résultat :
| avg_salary |
|---|
| 1000 |
Pourquoi ?
Parce que AVG() va calculer :
[(1000 + 0 + 2000) / 3 = 1000]
La ligne avec NULL est ignorée dans le calcul de la moyenne.
Exemple : Calcul de l'âge moyen des étudiants
Regardons maintenant la table students :
| id | name | age |
|---|---|---|
| 1 | Anna | 20 |
| 2 | Max | 22 |
| 3 | Maria | NULL |
| 4 | Otto | 21 |
Requête :
SELECT AVG(age) AS average_age
FROM students;
Résultat :
| average_age |
|---|
| 21 |
AVG()ignore l'étudiante Maria, car son âge est NULL.- La moyenne est calculée comme : (20 + 22 + 21) / 3 = 21.
Arrondir le résultat
Parfois, le résultat de AVG() donne un nombre à virgule avec plusieurs décimales.
Si tu veux un nombre arrondi, utilise la fonction ROUND().
Table employees
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | NULL |
Requête SQL
SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;
Résultat
| rounded_average_salary |
|---|
| 52333.33 |
La ligne avec NULL est exclue du calcul, donc la moyenne est faite sur trois valeurs.
Filtrer les données avant de calculer AVG()
Si tu veux calculer la moyenne, mais seulement pour les valeurs qui remplissent certaines conditions, utilise WHERE.
Table employees
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | 60000 |
| 5 | NULL |
Exemple : Trouvons le salaire moyen des employés dont id > 2.
SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;
Résultat
| average_salary |
|---|
| 53500 |
Dans le calcul, il n'y a que les salaires avec id = 3 et id = 4. La ligne avec NULL est exclue.
Exemple : Requêtes complexes avec AVG()
On peut combiner la fonction AVG() avec d'autres fonctions d'agrégation et opérateurs.
Par exemple, on a une table des ventes sales :
| sale_id | product | quantity | price |
|---|---|---|---|
| 1 | Téléphone | 2 | 500 |
| 2 | Ordinateur portable | 1 | 1500 |
| 3 | Tablette | 3 | 300 |
Requête pour calculer la moyenne du total des ventes :
SELECT AVG(quantity * price) AS average_total_sale
FROM sales;
Résultat :
| averagetotalsale |
|---|
| 950 |
Tips de la vraie vie et erreurs classiques
Faut faire gaffe avec AVG() pour éviter les erreurs classiques :
Valeurs NULL : parfois tu te demandes pourquoi le résultat est plus bas que prévu. Rappelle-toi que AVG() saute les lignes avec NULL.
Mélange de types de données : si dans la colonne t'as des nombres et du texte (mauvaise pratique, clairement), AVG() va planter.
GO TO FULL VERSION