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