Niveau 9 : Relier deux tables avec JOIN

Niveau 9 : Relier deux tables avec JOIN

Mis à jour le

Intermédiaire · niveau 9 sur 20. Objectif : Combiner les informations de deux tables liées par un identifiant.

Notions : JOIN … ON alias de table clé étrangère

Leçon

Dans une base bien conçue, on évite de répéter l'information. La table movies ne contient pas le nom du réalisateur, seulement director_id, un numéro. Le nom est rangé une seule fois dans la table directors. Si un réalisateur change de nom, on ne le corrige qu'à un endroit.

director_id est une clé étrangère : il pointe vers la colonne id de directors, sa clé primaire, qui identifie chaque réalisateur de façon unique. Night Train a director_id = 1 : son réalisateur est la ligne de directors dont l'id vaut 1, Nora Ellis.

JOIN reconstitue ce lien. FROM movies JOIN directors ON directors.id = movies.director_id associe à chaque film la ligne du réalisateur correspondant. ON donne la condition de correspondance. Le résultat dispose des colonnes des deux tables.

Pour écrire moins, on donne un alias court à chaque table : FROM movies m JOIN directors d ON d.id = m.director_id. On préfixe ensuite les colonnes : m.title, d.name. Le préfixe devient obligatoire quand une colonne existe dans les deux tables (id, name…) : sinon SQL ne sait pas laquelle tu veux.

JOIN (ou INNER JOIN) ne garde que les lignes qui ont une correspondance des deux côtés. Deep Current, sans réalisateur, disparaît ; Sara Diaz, sans film, aussi. Le niveau suivant montre comment les garder.

Après une jointure, on peut filtrer, trier et regrouper comme sur une seule table. Quand on regroupe, regroupe sur l'identifiant en plus du nom (GROUP BY d.id, d.name) : deux réalisateurs peuvent porter le même nom. Nos données n'en contiennent pas, mais c'est courant dans une vraie base : prends l'habitude dès maintenant.

Syntaxe

SELECT a.col, b.col
FROM table_a a
JOIN table_b b ON b.id = a.b_id;

Exemple commenté

SELECT m.title, d.name AS director
FROM movies m
JOIN directors d ON d.id = m.director_id;

Chaque film est associé à son réalisateur. Deep Current, dont director_id est vide, n'apparaît pas.

Table movies (10 lignes)
idtitlegenreyeardurationratingdirector_id
1Night TrainThriller20151187.81
2Blue HarborDrama20181027.12
3Paper Moon CityComedy2012956.45
4Silent PeakDrama20201318.23
5Last SignalSci-Fi20191427.51
6Summer KeysComedy2016885.94
7Iron GardenSci-Fi202112583
8Dust and GoldWestern20141106.82
9The Quiet HourDrama2022977.45
10Deep CurrentThriller20171056.9NULL
Table directors (6 lignes)
idnamecountry
1Nora EllisUK
2Paulo ReisBrazil
3Kenji MoriJapan
4Anna BergSweden
5Luc MartinFrance
6Sara DiazSpain

Résultat de l’exemple

titledirector
Night TrainNora Ellis
Blue HarborPaulo Reis
Paper Moon CityLuc Martin
Silent PeakKenji Mori
Last SignalNora Ellis
Summer KeysAnna Berg
Iron GardenKenji Mori
Dust and GoldPaulo Reis
The Quiet HourLuc Martin

À retenir

  • ON relie la clé étrangère à l'identifiant.
  • Préfixe les colonnes avec l'alias de leur table.
  • JOIN ne garde que les lignes qui correspondent.

Pièges fréquents

  • Deux tables ont souvent une colonne name : sans préfixe, SQL signale une colonne ambiguë.
  • Oublier ON : SQLite associe alors chaque ligne à toutes les lignes de l'autre table, sans aucune erreur.
  • GROUP BY a.name fusionnerait deux homonymes : regroupe sur a.id, a.name.

Spécificité SQLite

SQLite (comme MySQL) accepte un JOIN sans ON et le traite comme un produit cartésien. PostgreSQL, SQL Server et Oracle refusent la requête : en SQL standard, JOIN exige ON (ou USING). Quand tu veux vraiment toutes les combinaisons, écris-le explicitement avec CROSS JOIN.

Les 5 exercices du niveau

  1. Guidé · Affiche le titre de chaque livre et le nom de son auteur. (Tables : books, authors)
  2. Entraînement · Affiche le nom de chaque joueur et le nom de son équipe. (Tables : players, teams)
  3. Entraînement · Affiche le nom de l'hôtel, le type et le prix des chambres des hôtels situés à 'Paris'. (Tables : rooms, hotels)
  4. Entraînement · Affiche le nom de chaque artiste et son nombre de chansons. (Tables : songs, artists)
  5. Défi · Affiche la compagnie, la ville d'arrivée et le prix des 3 vols les plus chers à destination d'un pays autre que la France. (Tables : flights, airports)

Dans SpeedQL, chaque requête est corrigée tout de suite : le résultat est comparé à celui attendu, puis la requête est relancée sur une base de contrôle cachée. Chaque exercice a ses indices écrits, à afficher seulement si tu bloques.

Voir aussi : la fiche de l’aide-mémoire · les exercices SQL corrigés sur cette notion

Faire les exercices du niveau 9

Gratuit, sans inscription : la leçon et les 5 exercices s’ouvrent directement dans ton navigateur.

Ouvrir le niveau 9 dans SpeedQL

·