SQL COUNT, SUM, AVG, MIN et MAX
Combien de commandes avons-nous reçues ? Quel est le prix moyen de nos produits ? Quel est le salaire le plus élevé ? Les fonctions d'agrégation répondent à ce type de question : elles prennent toutes les lignes d'une colonne et les résument en une seule valeur.
Syntaxe
SELECT COUNT(*), SUM(colonne), AVG(colonne), MIN(colonne), MAX(colonne)
FROM table;Comment ça marche
| Fonction | Renvoie |
|---|---|
COUNT(*) | le nombre de lignes |
COUNT(colonne) | le nombre de valeurs non NULL |
SUM(colonne) | la somme |
AVG(colonne) | la moyenne |
MIN(colonne) / MAX(colonne) | la plus petite / la plus grande valeur (marche aussi avec des textes et des dates) |
Sans GROUP BY, une requête qui utilise une agrégation renvoie une seule ligne pour toute la table. Pour obtenir un résultat par catégorie, par ville ou par mois, il faut ajouter un GROUP BY (voir le cours suivant).
Les moyennes donnent souvent beaucoup de décimales : ROUND(AVG(prix), 2) arrondit à deux chiffres après la virgule.
On peut aussi combiner une agrégation avec un WHERE : le filtre est appliqué avant le calcul.
Schéma
| nom | prix |
|---|---|
| Clavier | 49 |
| Plaid | 25 |
| Gourde | 12 |
| SUM(prix) |
|---|
| 86 |
Schéma simplifié pour illustrer le principe. Les exemples ci-dessous utilisent la vraie base d'exercices de SQL Quest (une boutique en ligne fictive : voir le schéma complet).
Exemples avec leurs résultats
1. Compter des lignes
Le nombre total de commandes.
SELECT COUNT(*) AS nb_commandes
FROM commandes; Essayer dans le bac à sable| nb_commandes |
|---|
| 600 |
1 ligne au total
2. Plusieurs agrégations à la fois
Le prix minimum, maximum et moyen des produits.
SELECT MIN(prix) AS min, MAX(prix) AS max, ROUND(AVG(prix), 2) AS moyenne
FROM produits; Essayer dans le bac à sable| min | max | moyenne |
|---|---|---|
| 3,7 | 342 | 56,04 |
1 ligne au total
3. Une somme calculée
Le chiffre d'affaires total : la somme de quantité × prix unitaire sur toutes les lignes de commande.
SELECT ROUND(SUM(quantite * prix_unitaire), 2) AS chiffre_affaires
FROM lignes_commande; Essayer dans le bac à sable| chiffre_affaires |
|---|
| 241 959,75 |
1 ligne au total
4. Agréger après un filtre
Le nombre de commandes annulées et la date de la première.
SELECT COUNT(*) AS annulees, MIN(date_commande) AS premiere
FROM commandes
WHERE statut = 'annulée'; Essayer dans le bac à sable| annulees | premiere |
|---|---|
| 92 | 2023-01-09 |
1 ligne au total
Les erreurs fréquentes
Mélanger une colonne et une agrégation sans GROUP BY
SQLite accepte cette requête mais affiche un nom de produit pris au hasard, sans lien avec le total. Les autres bases la refusent.
SELECT nom, SUM(stock) FROM produits;SELECT categorie, SUM(stock) FROM produits GROUP BY categorie;Utiliser une agrégation dans WHERE
WHERE est évalué ligne par ligne, avant tout calcul de groupe : il ne peut pas contenir de COUNT ou de SUM. Utilisez HAVING.
SELECT categorie FROM produits WHERE COUNT(*) > 5 GROUP BY categorie;SELECT categorie FROM produits GROUP BY categorie HAVING COUNT(*) > 5;Oublier d'arrondir
Une moyenne affiche souvent de nombreuses décimales. Arrondissez avec ROUND.
SELECT AVG(salaire) FROM employes;SELECT ROUND(AVG(salaire), 2) FROM employes;Exercices
Essayez d'écrire la requête vous-même avant d'ouvrir la solution.
Défi 1. Calculez la masse salariale (somme des salaires) et le salaire moyen arrondi à l'euro.
Voir une solution
SELECT SUM(salaire) AS masse_salariale, ROUND(AVG(salaire)) AS salaire_moyen FROM employes;| masse_salariale | salaire_moyen |
|---|---|
| 117 900 | 4 716 |
1 ligne au total
Essayer dans le bac à sableDéfi 2. Quelle est la date de la première et de la dernière commande ?
Voir une solution
SELECT MIN(date_commande) AS premiere, MAX(date_commande) AS derniere FROM commandes;| premiere | derniere |
|---|---|
| 2023-01-02 | 2025-12-28 |
1 ligne au total
Essayer dans le bac à sableLes exercices interactifs sont corrigés automatiquement, avec un prof qui explique vos erreurs. Une leçon résumée reste affichée à côté de l'éditeur.
Questions fréquentes
Quelle différence entre COUNT(*) et COUNT(colonne) ?
COUNT(*) compte toutes les lignes. COUNT(colonne) ne compte que les lignes où la colonne n'est pas NULL.
AVG prend-il en compte les valeurs NULL ?
Non : AVG fait la moyenne des seules valeurs connues. Comme SUM, MIN et MAX, il ignore les NULL.
Peut-on utiliser plusieurs fonctions d'agrégation dans une requête ?
Oui, autant que vous voulez dans le SELECT, comme dans l'exemple MIN, MAX et AVG ci-dessus.