SQL RIGHT JOIN : garder toutes les lignes de la table de droite
Leçon 5.4 · Temps de lecture : ~4 min
Le SQL RIGHT JOIN renvoie chaque ligne de la table de droite et les lignes correspondantes de la table de gauche ; en l'absence de correspondance, les colonnes de la table de gauche valent NULL. Dans cette leçon, vous apprendrez la syntaxe de RIGHT JOIN, comment il reflète LEFT JOIN, et pourquoi la plupart des développeurs le réécrivent en LEFT JOIN.
RIGHT JOIN est l'image miroir de LEFT JOIN. La seule différence est la table qui garde toutes ses lignes : avec LEFT JOIN, c'est la table qui suit FROM ; avec RIGHT JOIN, c'est la table qui suit JOIN.
Ce que renvoie RIGHT JOIN
- Chaque ligne de la table de droite (celle qui suit
RIGHT JOIN) apparaît dans le résultat. - Les lignes avec correspondances y sont combinées, comme avec
INNER JOIN. - Les lignes sans correspondance reçoivent
NULLdans toutes les colonnes de la table de gauche.
RIGHT JOIN et RIGHT OUTER JOIN sont identiques.
Syntaxe de base
SELECT left_table.column1, right_table.column2
FROM left_table
RIGHT JOIN right_table ON left_table.key_column = right_table.key_column;
Exemple : toutes les adresses et leurs employés
La table address stocke les adresses des clients, des employés et des magasins. Pour lister toutes les adresses et montrer lesquelles appartiennent à des employés :
SELECT s.first_name, s.last_name, a.address, a.district
FROM staff AS s
RIGHT JOIN address AS a ON s.address_id = a.address_id
ORDER BY s.staff_id IS NULL, a.address
LIMIT 10;
Résultat : les 603 adresses ; les deux adresses des employés viennent en premier avec leurs noms, les autres ont NULL dans first_name et last_name.
RIGHT JOIN sous forme de LEFT JOIN
Tout RIGHT JOIN peut être réécrit en LEFT JOIN en inversant les tables. Ces deux requêtes renvoient les mêmes lignes :
-- RIGHT JOIN : toutes les adresses sont conservées
SELECT s.first_name, s.last_name, a.address
FROM staff AS s
RIGHT JOIN address AS a ON s.address_id = a.address_id;
-- LEFT JOIN avec les tables inversées : même résultat
SELECT s.first_name, s.last_name, a.address
FROM address AS a
LEFT JOIN staff AS s ON s.address_id = a.address_id;
Résultat : les deux requêtes renvoient 603 lignes.
La plupart des développeurs n'utilisent que LEFT JOIN. La requête se lit alors naturellement : la table principale vient en premier après FROM, et chaque jointure suivante ne fait qu'y ajouter des informations. Mélanger LEFT et RIGHT dans une même requête rend difficile de voir quelles lignes sont garanties.
Quand RIGHT JOIN est utile
- Lire du code existant. Vous rencontrerez
RIGHT JOINdans les requêtes d'autres personnes et dans des requêtes générées par des outils. - Ajouter une table à la fin d'une longue requête. Il est parfois plus simple d'ajouter un
RIGHT JOINque de réordonner une longue chaîne de jointures. Même dans ce cas, réécrire la requête avecLEFT JOINla rend généralement plus claire.
SQLite n'a ajouté RIGHT JOIN qu'à partir de la version 3.39 (2022) ; dans les versions plus anciennes, utilisez LEFT JOIN en inversant les tables.
Points clés :
RIGHT JOINconserve chaque ligne de la table de droite ; les lignes sans correspondance reçoiventNULLdans les colonnes de gauche.A RIGHT JOIN Brenvoie les mêmes lignes queB LEFT JOIN A.- La plupart des requêtes utilisent
LEFT JOINavec la table principale aprèsFROM: c'est plus lisible. - Évitez de mélanger
LEFT JOINetRIGHT JOINdans une même requête.
Questions fréquentes
Quelle est la différence entre LEFT JOIN et RIGHT JOIN ?
LEFT JOIN conserve toutes les lignes de la table qui suit FROM ; RIGHT JOIN conserve toutes les lignes de la table qui suit JOIN. Inverser les tables transforme l'un en l'autre.
Pourquoi les développeurs utilisent-ils rarement RIGHT JOIN ?
Parce qu'un LEFT JOIN avec les tables inversées donne le même résultat et se lit plus naturellement : la table principale vient en premier, et les tables jointes y ajoutent des détails.
RIGHT JOIN est-il identique à RIGHT OUTER JOIN ?
Oui. Le mot-clé OUTER est facultatif.