Leçon 5.2 · Temps de lecture : ~6 min
Le SQL INNER JOIN combine les lignes de deux tables et ne renvoie que les paires pour lesquelles la condition de jointure est vraie, c'est-à-dire les lignes qui ont une correspondance dans les deux tables. Dans cette leçon, vous apprendrez la syntaxe d'INNER JOIN, l'intérêt des alias de tables, comment joindre trois tables et ce qui arrive aux lignes sans correspondance.
SQL INNER JOIN : combiner les lignes correspondantes
Dans la leçon précédente, vous avez vu pourquoi les données sont réparties entre plusieurs tables et comment les clés les relient. INNER JOIN est la façon la plus courante de les réunir : une ville avec son pays, un paiement avec son client, un acteur avec ses films.
Ce que renvoie INNER JOIN
INNER JOIN vérifie la condition de jointure pour des paires de lignes des deux tables et ne garde que les paires pour lesquelles elle est vraie.
- Une ligne de la première table sans ligne correspondante dans la seconde n'apparaît pas dans le résultat.
- Une ligne de la seconde table sans correspondance n'y apparaît pas non plus.
- Une ligne avec plusieurs correspondances apparaît plusieurs fois, une fois par correspondance.
C'est pourquoi on décrit souvent INNER JOIN comme l'intersection de deux tables.
Syntaxe de base
SELECT table1.column1, table2.column2
FROM table1
INNER JOIN table2 ON table1.key_column = table2.key_column;
INNER JOINnomme la deuxième table.ONdéfinit la condition de jointure, généralement « clé étrangère = clé primaire ».- Le mot-clé
INNERest facultatif :JOINseul signifieINNER JOIN.
Joindre deux tables
La table city stocke country_id, une référence à la table country. Pour voir le nom du pays à côté de chaque ville :
SELECT city.city, country.country
FROM city
INNER JOIN country ON city.country_id = country.country_id
ORDER BY country.country, city.city;
Résultat : 600 villes, chacune avec le nom de son pays.
Lorsque les deux tables ont une colonne du même nom, comme country_id ici, il faut la préfixer par le nom de la table ; sinon, la base de données signale une colonne ambiguë.
Les alias de tables
Les noms de tables longs rendent les jointures difficiles à lire. Un alias de table est un nom court défini après la table :
SELECT ci.city, co.country
FROM city AS ci
INNER JOIN country AS co ON ci.country_id = co.country_id
ORDER BY co.country, ci.city;
Le résultat est identique. Dès qu'une table a un alias, utilisez cet alias partout dans la requête. Choisissez des alias courts mais parlants : ci et co sont plus faciles à suivre que a et b.
Joindre trois tables
Un acteur peut jouer dans de nombreux films, et un film a de nombreux acteurs. Une telle relation plusieurs-à-plusieurs est stockée dans une table de liaison : film_actor contient des paires (actor_id, film_id). Pour lister les acteurs avec les titres des films, joignez les trois tables :
SELECT a.first_name, a.last_name, f.title
FROM actor AS a
INNER JOIN film_actor AS fa ON fa.actor_id = a.actor_id
INNER JOIN film AS f ON f.film_id = fa.film_id
ORDER BY a.last_name, a.first_name, f.title
LIMIT 10;
Résultat : les 10 premières paires acteur–film par ordre alphabétique des acteurs.
- La première jointure ajoute les lignes de
film_actorde chaque acteur. - La seconde jointure ajoute le film de chacune de ces lignes.
- Chaque
JOINtravaille sur le résultat du précédent, vous pouvez donc enchaîner autant de tables que nécessaire.
Combiner JOIN avec WHERE et ORDER BY
Une jointure est suivie des clauses habituelles. Par exemple, les films avec Nick Wahlberg :
SELECT f.title, f.release_year, f.rating
FROM actor AS a
INNER JOIN film_actor AS fa ON fa.actor_id = a.actor_id
INNER JOIN film AS f ON f.film_id = fa.film_id
WHERE a.first_name = 'NICK'
AND a.last_name = 'WAHLBERG'
ORDER BY f.title;
Résultat : les titres, années de sortie et classifications de tous les films avec cet acteur.
Les lignes sans correspondance disparaissent
INNER JOIN supprime silencieusement les lignes sans correspondance. Sakila compte 1000 films, mais seuls 958 d'entre eux ont des exemplaires dans la table inventory :
SELECT f.title, i.inventory_id, i.store_id
FROM film AS f
INNER JOIN inventory AS i ON i.film_id = f.film_id
ORDER BY f.title
LIMIT 10;
Résultat : les films avec leurs exemplaires ; 42 films sans exemplaire n'apparaissent pas du tout, et un film avec plusieurs exemplaires apparaît plusieurs fois.
Lorsque les lignes sans correspondance doivent rester dans le résultat, utilisez LEFT JOIN, que vous verrez dans la leçon suivante.
Points clés :
INNER JOINne renvoie que les paires de lignes qui satisfont la conditionON.- Les lignes sans correspondance dans l'autre table sont supprimées ; celles avec plusieurs correspondances sont répétées.
JOINetINNER JOINsont identiques.- Utilisez des alias de tables et préfixez les colonnes présentes dans les deux tables.
- Enchaînez plusieurs
JOINpour traverser les tables de liaison commefilm_actor.
Questions fréquentes
Quelle est la différence entre JOIN et INNER JOIN ?
Aucune. JOIN sans type est un INNER JOIN dans tous les principaux SGBD. Écrire INNER JOIN explicitement rend l'intention plus claire lorsqu'une requête mélange plusieurs types de jointures.
Pourquoi mon INNER JOIN renvoie-t-il des lignes en double ?
Parce qu'une ligne a plusieurs correspondances dans l'autre table. Un film avec quatre exemplaires dans inventory apparaît quatre fois après la jointure de film et inventory. C'est le comportement normal d'une jointure ; agrégez ou filtrez si vous voulez une ligne par film.
Peut-on joindre plus de deux tables en SQL ?
Oui. Ajoutez un JOIN ... ON ... par table. Chaque jointure relie une nouvelle table aux tables déjà jointes.