⌂  Menu général
Chapitre Bases de données

JOIN et agrégats

Les données sont éclatées en plusieurs tables pour éviter la redondance. JOIN les recombine. Les fonctions d'agrégation en tirent des statistiques.

Durée · 2h Séance · 5 / 7 Outil · DB Browser for SQLite
Au programme

Objectifs de la séance

  • Combiner plusieurs tables avec JOIN.
  • Calculer des statistiques avec COUNT, SUM, AVG, MIN, MAX.
  • Regrouper des lignes avec GROUP BY et filtrer les groupes avec HAVING.
Rappel

La base de référence

TableContenu de référence
ARTISTE1 DJ Solstice/Électro · 2 Les Foudres/Rock · 3 Miles & Co/Jazz
SALLE1 Zénith/Lyon · 2 Stade des Lumières/Lyon · 3 Le Trianon/Paris
CONCERT1 Nuit Électro (art.1,salle1) · 2 Rock en Seine (art.2,salle2) · 3 Jazz... (art.3,salle3)
BILLET(1,sp1,c1,45) (2,sp2,c1,45) (3,sp1,c2,38) (4,sp3,c1,45) (5,sp2,c3,30) (6,sp3,c2,38)
Cours

Pourquoi JOIN ?

Le schéma relationnel est éclaté en plusieurs tables (pour éviter la redondance, vue en séance 1). Pour répondre à « quel artiste joue à quel concert ? », il faut recombiner les tables.

CONCERT
JOIN
ARTISTE
ON ...
SELECT colonnes FROM table1 JOIN table2 ON table1.cle = table2.cle;

Exemple guidé :

SELECT nom_concert, nom_artiste FROM CONCERT JOIN ARTISTE ON CONCERT.id_artiste = ARTISTE.id_artiste;
Exercice 1

S'entraîner au JOIN

a. Nom du concert + nom et ville de sa salle
SELECT nom_concert, nom_salle, ville FROM CONCERT JOIN SALLE ON CONCERT.id_salle = SALLE.id_salle;
b. Spectateur + concert acheté
SELECT nom_spectateur, nom_concert FROM BILLET JOIN SPECTATEUR ON BILLET.id_spectateur = SPECTATEUR.id_spectateur JOIN CONCERT ON BILLET.id_concert = CONCERT.id_concert;
c. Défi — spectateur + concert + artiste (3 tables)
SELECT nom_spectateur, nom_concert, nom_artiste FROM BILLET JOIN SPECTATEUR ON BILLET.id_spectateur = SPECTATEUR.id_spectateur JOIN CONCERT ON BILLET.id_concert = CONCERT.id_concert JOIN ARTISTE ON CONCERT.id_artiste = ARTISTE.id_artiste;
Cours + Exercice 2

Les fonctions d'agrégation

Elles calculent une statistique sur un ensemble de lignes.

COUNT(*)
Nombre de lignes
SUM(col)
Somme
AVG(col)
Moyenne
MIN(col)
Minimum
MAX(col)
Maximum
a. Combien de billets vendus au total ?
SELECT COUNT(*) FROM BILLET;
→ 6
b. Recette totale de la billetterie ?
SELECT SUM(prix) FROM BILLET;
→ 241€
c. Prix minimum et maximum ?
SELECT MIN(prix), MAX(prix) FROM BILLET;
→ 30€ et 45€
Cours + Exercice 3

Regrouper avec GROUP BY, filtrer avec HAVING

GROUP BY regroupe les lignes ayant la même valeur dans une colonne, pour appliquer une fonction d'agrégation à chaque groupe séparément :

SELECT id_concert, COUNT(*) AS nb_billets FROM BILLET GROUP BY id_concert;

HAVING filtre les groupes obtenus (contrairement à WHERE, qui filtre les lignes avant le regroupement) :

SELECT id_concert, COUNT(*) AS nb_billets FROM BILLET GROUP BY id_concert HAVING COUNT(*) > 1;
Attention : WHERE ne peut pas utiliser une fonction d'agrégation (WHERE COUNT(*) > 1 est incorrect) — c'est justement le rôle de HAVING.
a. Billets vendus par concert
→ concert 1 : 3 billets · concert 2 : 2 billets · concert 3 : 1 billet.
b. Recette par concert
→ concert 1 : 135€ (3×45) · concert 2 : 76€ (38+38) · concert 3 : 30€.
c. Défi — concerts à plus de 100€ de recette
SELECT id_concert, SUM(prix) AS recette FROM BILLET GROUP BY id_concert HAVING SUM(prix) > 100;
→ seul le concert 1 apparaît (135€).
À ton rythme

Exercices gradués

Niveau 1

Affiche le nom de chaque salle avec le nom des concerts qui s'y déroulent.

Voir la correction
SELECT nom_salle, nom_concert FROM SALLE JOIN CONCERT ON SALLE.id_salle = CONCERT.id_salle;
Niveau 2

Affiche, pour chaque concert (avec son nom), le nombre de billets vendus, triés du plus vendu au moins vendu.

Voir la correction
SELECT nom_concert, COUNT(*) AS nb_billets FROM BILLET JOIN CONCERT ON BILLET.id_concert = CONCERT.id_concert GROUP BY nom_concert ORDER BY nb_billets DESC;
→ Nuit Électro (3), Rock en Seine (2), Jazz sous les étoiles (1).
Niveau 3 — défi

Affiche le nom de chaque artiste et le nombre total de billets vendus pour ses concerts.

Voir la correction
SELECT nom_artiste, COUNT(*) AS nb_billets FROM BILLET JOIN CONCERT ON BILLET.id_concert = CONCERT.id_concert JOIN ARTISTE ON CONCERT.id_artiste = ARTISTE.id_artiste GROUP BY nom_artiste;
→ DJ Solstice : 3 · Les Foudres : 2 · Miles & Co : 1.
Bilan

Vocabulaire clé de la séance

JOIN ... ON COUNT SUM AVG MIN / MAX GROUP BY HAVING AS (alias)
Séance 6

La suite : entraînement bac

On applique tout ce qui a été vu sur des sujets de bac complets (partie bases de données), en conditions proches de l'épreuve.