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.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
| id | name | country |
|---|---|---|
| 1 | Nora Ellis | UK |
| 2 | Paulo Reis | Brazil |
| 3 | Kenji Mori | Japan |
| 4 | Anna Berg | Sweden |
| 5 | Luc Martin | France |
| 6 | Sara Diaz | Spain |
Résultat de l’exemple
| title | director |
|---|---|
| Night Train | Nora Ellis |
| Blue Harbor | Paulo Reis |
| Paper Moon City | Luc Martin |
| Silent Peak | Kenji Mori |
| Last Signal | Nora Ellis |
| Summer Keys | Anna Berg |
| Iron Garden | Kenji Mori |
| Dust and Gold | Paulo Reis |
| The Quiet Hour | Luc 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
- Affiche le titre de chaque livre et le nom de son auteur.
- Affiche le nom de chaque joueur et le nom de son équipe.
- Affiche le nom de l'hôtel, le type et le prix des chambres des hôtels situés à 'Paris'.
- Affiche le nom de chaque artiste et son nombre de chansons.
- 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.
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.
← Niveau précédent : Filtrer les groupes avec HAVING · Niveau suivant : LEFT JOIN et jointures multiples →