Le RIGHT JOIN (ou RIGHT OUTER JOIN) est l'opposé logique du LEFT JOIN. Il garantit que toutes les lignes de la table "droite" (celle mentionnée après le mot-clé JOIN) sont incluses dans le résultat, qu'elles aient ou non une correspondance dans la table "gauche".
Un RIGHT JOIN retourne toutes les lignes de la table de droite et les lignes correspondantes de la table de gauche. Si aucune correspondance n'existe dans la table de gauche, les colonnes de celle-ci seront NULL.
Visualisation :
Table A (customer) Table B (payment)
+----+----------+ +----+----------+
| id | name | | id | amount |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | 10.00 | (Correspondance !)
| NULL | <--------> | 4 | 50.00 | (Pas de client, paiement conservé !)
+----+----------+ +----+----------+
Dans cet exemple, le paiement avec l'ID 4 est conservé même si aucun client n'y est associé (dans une base bien conçue comme Sakila, cela reste rare à cause des contraintes de clé étrangère).
La syntaxe suit le même schéma que les autres types de jointures :
SELECT
table1.column1,
table2.column2
FROM
table1
RIGHT JOIN
table2 ON table1.common_column = table2.common_column;
RIGHT JOIN : garantit que toutes les lignes de table2 (la table de droite) sont conservées.ON : spécifie la condition de jointure.Le RIGHT JOIN est moins courant que le LEFT JOIN (car tout RIGHT JOIN peut être réécrit en LEFT JOIN en inversant l'ordre des tables), mais il reste important à comprendre.
Supposons que l'on souhaite voir toutes les adresses et vérifier si un membre du personnel y est affecté.
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
ORDER BY
s.last_name;
Cela retournera toutes les adresses de la table address. Si aucune adresse n'a de personnel, les noms seront NULL.
Chaque RIGHT JOIN peut être exprimé comme un LEFT JOIN. La plupart des développeurs SQL préfèrent utiliser uniquement LEFT JOIN et simplement inverser l'ordre des tables pour garder la "table principale" à gauche, ce qui rend la requête plus lisible.
Exemple d'équivalence :
-- Avec RIGHT JOIN
SELECT f.title, i.inventory_id
FROM film f
RIGHT JOIN inventory i ON f.film_id = i.film_id;
-- Avec LEFT JOIN (même résultat)
SELECT f.title, i.inventory_id
FROM inventory i
LEFT JOIN film f ON i.film_id = f.film_id;
LEFT JOIN.