Cours

SQL Leçon 5

Compter et regrouper

Faire des calculs sur plusieurs lignes : compter, additionner, faire des moyennes, et regrouper par catégorie.

20 min

À 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 prix

Avec 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    |      1

HAVING : 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.

requete.sql
Résultat

É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)

idnom
1BTS SIO 1
2BTS SIO 2
3Terminale STMG

eleves (7 lignes)

idprenomnomagevilleclasse_id
1LéaMartin18Chartres1
2TomBernard19Dreux2
3InèsPetit18Chartres1
4HugoDurand20Paris2
5ChloéLambert17Lucé3
6NathanDubois19Chartres1
7SarahMoreau18DreuxNULL

notes (9 lignes)

ideleve_idmatierenote
11Développement16
21Réseau12
32Développement11
42Réseau15
53Développement18
64Réseau9
76Développement13
86Réseau14
95Gestion15
  • 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
Bloqué ? Voir une solution
SELECT ville, AVG(age) AS age_moyen
FROM eleves
GROUP BY ville;

Quiz

1Que renvoie SELECT COUNT(*) FROM eleves; ?
2Pour garder seulement les villes qui ont plus de 10 élèves, on utilise…
3Quelle fonction donne la plus grande valeur ?