On commence par la définition. RIGHT JOIN, c'est un type de jointure qui retourne toutes les lignes de la table de droite (c'est pour ça qu'on l'appelle "droite"), et seulement les lignes correspondantes de la table de gauche. Si la table de gauche n'a pas de données qui matchent avec une ligne de la table de droite, tu verras des valeurs NULL pour les colonnes de la table de gauche.
Tu connais déjà LEFT JOIN, c'est presque pareil mais en mode "miroir". La différence principale, c'est quelle table est considérée comme principale : la gauche ou la droite.
Syntaxe de RIGHT JOIN
La syntaxe de RIGHT JOIN est quasiment identique à celle de LEFT JOIN. Voilà à quoi ça ressemble :
SELECT
colonnes
FROM
table_gauche RIGHT JOIN table_droite
ON
condition_de_jointure;
Fais gaffe à l'ordre des tables :
- table de gauche s'écrit avant
RIGHT JOIN; - table de droite vient après le mot
RIGHT JOIN.
Imaginons qu'on a deux tables :
students — la liste des étudiants :
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Maria |
| 3 | Alex |
enrollments — les inscriptions des étudiants aux cours :
| enrollment_id | course_name | student_id |
|---|---|---|
| 101 | Mathématiques | 1 |
| 102 | Informatique | 2 |
| 103 | Biologie | NULL |
Maintenant, on veut obtenir la liste de toutes les inscriptions, et aussi les infos sur les étudiants s'ils existent. Si l'étudiant n'est pas trouvé, on verra NULL à la place de ses infos.
La requête avec RIGHT JOIN ressemblera à ça :
SELECT
enrollments.enrollment_id,
enrollments.course_name,
students.name AS student_name
FROM
students RIGHT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Résultat :
| enrollment_id | course_name | student_name |
|---|---|---|
| 101 | Mathématiques | Otto |
| 102 | Informatique | Maria |
| 103 | Biologie | NULL |
Ici, tu vois que toutes les lignes de la table enrollments (table de droite) sont dans le résultat, même si elles n'ont pas de correspondance dans la table students (table de gauche).
Comparaison RIGHT JOIN et LEFT JOIN
Si tu piges déjà comment marche LEFT JOIN, tu peux te demander : "Mais à quoi ça sert RIGHT JOIN ? Pourquoi pas juste utiliser LEFT JOIN ?" Bonne question ! Voyons les différences et les cas où il vaut mieux choisir RIGHT JOIN.
Sens des données
LEFT JOIN: retourne toutes les lignes de la table de gauche, même s'il n'y a pas de correspondance dans la table de droite.RIGHT JOIN: retourne toutes les lignes de la table de droite, même s'il n'y a pas de correspondance dans la table de gauche.
Choix de la table principale En général, tu choisis
LEFTouRIGHTselon la table (gauche ou droite) qui t'intéresse le plus et dans quel ordre tu préfères écrire ta requête.Équivalence N'importe quel
RIGHT JOINpeut être réécrit enLEFT JOINen inversant l'ordre des tables. Par exemple :-- RIGHT JOIN SELECT * FROM students RIGHT JOIN enrollments ON students.student_id = enrollments.student_id; -- LEFT JOIN équivalent SELECT * FROM enrollments LEFT JOIN students ON students.student_id = enrollments.student_id;
Donc, si t'es pas fan du mot RIGHT JOIN, tu peux toujours l'éviter !
Quand utiliser RIGHT JOIN ?
En vrai, RIGHT JOIN est moins utilisé que LEFT JOIN. Mais il y a des cas où ça peut servir :
- Si la table de droite est plus importante (genre c'est ta table principale) ;
- Quand tu veux organiser ta requête dans un ordre où la table de droite vient logiquement après la gauche ;
- Si tu bosses sur du code existant qui utilise
RIGHT JOINpar défaut.
Représentation visuelle de RIGHT JOIN
Pour mieux piger RIGHT JOIN, mate ce schéma :
Table de gauche Table de droite
[ A ] --------> [ 1 ]
[ B ] --------> [ 2 ]
[ C ] --------> [ 3 ]
[ D ] [ 4 ]
Avec RIGHT JOIN, tu récupères toutes les valeurs de la table de droite avec les données correspondantes de la table de gauche. Ce qui manque dans la table de gauche sera rempli par NULL.
Exercice pratique
On va tester tes connaissances en pratique. Voilà l'exercice :
Tu as deux tables departments avec les départements et employees avec les employés : departments :
| department_id | department_name |
|---|---|
| 1 | IT |
| 2 | Ventes |
| 3 | Comptabilité |
employees :
| employee_id | name | department_id |
|---|---|---|
| 101 | Peter | 1 |
| 102 | Eva | 2 |
| 103 | Ron | NULL |
Écris une requête avec RIGHT JOIN qui retourne la liste de tous les départements, avec les employés s'ils sont dans un département, ou NULL si y'a pas d'employés.
Essaie de résoudre l'exercice tout seul avant de regarder la réponse.
Réponse à l'exercice
Voilà à quoi ressemble la requête :
SELECT
departments.department_name,
employees.name AS employee_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id;
Le résultat sera :
| department_name | employee_name |
|---|---|
| IT | Peter |
| Ventes | Eva |
| Comptabilité | NULL |
Erreurs courantes avec RIGHT JOIN
Quand tu bosses avec RIGHT JOIN, les débutants tombent souvent sur ces soucis :
- Ils oublient la condition de jointure
ON. Sans condition, tu obtiens le produit cartésien des tables, et là c'est le bazar. - Ils confondent
RIGHT JOINetLEFT JOIN. Si tu mets les tables dans le mauvais ordre, le résultat sera faux. - Ils ne gèrent pas les valeurs
NULL. Les requêtes avecRIGHT JOINramènent souvent desNULL, qu'il faut bien interpréter ou remplacer avecCOALESCE().
Voilà, c'est tout ! Maintenant tu sais utiliser RIGHT JOIN, tu piges la différence entre RIGHT JOIN et LEFT JOIN, et tu peux choisir la bonne jointure pour tes besoins. Dans la prochaine leçon, on parlera plus en détail de FULL OUTER JOIN, où on joint tout-tout des deux tables. Bonne chance avec tes requêtes !
GO TO FULL VERSION