SQL Leçon 5
Compter et regrouper
Faire des calculs sur plusieurs lignes : compter, additionner, faire des moyennes, et regrouper par catégorie.
À la fin de cette leçon, tu sauras
- Utiliser COUNT, SUM, AVG, MIN et MAX
- Regrouper des lignes avec GROUP BY
- Filtrer des groupes avec HAVING
Les fonctions d'agrégat
Elles prennent plusieurs lignes et renvoient une seule valeur.
SELECT COUNT(*) FROM eleves; -- le nombre d'élèves
SELECT AVG(age) FROM eleves; -- l'âge moyen
SELECT MIN(age), MAX(age) FROM eleves; -- le plus jeune et le plus âgé
SELECT SUM(prix) FROM produits; -- le total des prixAvec AS, on donne un nom plus clair à la colonne du résultat :
SELECT COUNT(*) AS nombre_eleves FROM eleves WHERE ville = 'Chartres';GROUP BY : un calcul par groupe
Pour avoir le nombre d'élèves de chaque ville, on regroupe les lignes qui ont la même ville :
SELECT ville, COUNT(*) AS nombre
FROM eleves
GROUP BY ville; ville | nombre
----------+--------
Chartres | 2
Dreux | 1
Paris | 1HAVING : filtrer les groupes
WHERE filtre les lignes avant le regroupement. Pour filtrer sur le résultat d'un calcul, on utilise HAVING, après le GROUP BY.
SELECT ville, COUNT(*) AS nombre
FROM eleves
GROUP BY ville
HAVING COUNT(*) >= 2;Attention : avec GROUP BY, chaque colonne du SELECT doit être soit une colonne du regroupement, soit un calcul (COUNT, AVG…).
À toi de jouer
Écris une requête qui affiche, pour chaque ville, l'âge moyen des élèves, dans une colonne nommée age_moyen.
Écris une requête : elle s'exécute pendant que tu tapes, sur une base d'exemple qui repart de zéro à chaque fois.
Voir les tables de la base d'exemple
classes (3 lignes)
| id | nom |
|---|---|
| 1 | BTS SIO 1 |
| 2 | BTS SIO 2 |
| 3 | Terminale STMG |
eleves (7 lignes)
| id | prenom | nom | age | ville | classe_id |
|---|---|---|---|---|---|
| 1 | Léa | Martin | 18 | Chartres | 1 |
| 2 | Tom | Bernard | 19 | Dreux | 2 |
| 3 | Inès | Petit | 18 | Chartres | 1 |
| 4 | Hugo | Durand | 20 | Paris | 2 |
| 5 | Chloé | Lambert | 17 | Lucé | 3 |
| 6 | Nathan | Dubois | 19 | Chartres | 1 |
| 7 | Sarah | Moreau | 18 | Dreux | NULL |
notes (9 lignes)
| id | eleve_id | matiere | note |
|---|---|---|---|
| 1 | 1 | Développement | 16 |
| 2 | 1 | Réseau | 12 |
| 3 | 2 | Développement | 11 |
| 4 | 2 | Réseau | 15 |
| 5 | 3 | Développement | 18 |
| 6 | 4 | Réseau | 9 |
| 7 | 6 | Développement | 13 |
| 8 | 6 | Réseau | 14 |
| 9 | 5 | Gestion | 15 |
- Le résultat donne le bon âge moyen pour chaque ville
- La requête sélectionne la ville
- Elle calcule AVG(age) nommé age_moyen
- Elle lit la table eleves
- Elle regroupe par ville
Bravo, toutes les consignes sont réussies !
Bloqué ? Voir une solution
SELECT ville, AVG(age) AS age_moyen
FROM eleves
GROUP BY ville;