Différences entre INNER, LEFT, RIGHT et OUTER JOIN en SQL

Il n’est point aisé de comprendre quelles sont les subtilités qui différencient ces différentes formes de jointures, nous allons donc voir ensemble leur signification et leur effet.

Nous prendrons pour cela le cas exemple d’une table main_table, sélectionnée par un FROM à laquelle est joint la table joined_table. Nous parlerons de correspondances dans le cas où une entrée de main_table possède une entrée associée dans joined_table.

Pré-requis

Pour comprendre le fonctionnement algorithmique d’une jointure, vous devez avoir en tête que main_table et joined_table sont jointes par la valeur partagée d’un de leurs champs respectifs, c’est à dire un champs de main_table à la même valeur qu’un champs de joined_table, permettant d’établir un lien, une correspondance entre les deux.

Mais il se peut qu’il existe des entrées de main_table qui ne soient liées à aucune entrée de joined_table et qu’il existe des entrées de joined_table qui ne soient pas liées à aucune entrée de main_table, ainsi certaines entrées peuvent théoriquement n’avoir aucune correspondance. Si on tente de faire une jointure sur l’autre table alors qu’elle ne possède aucune entrée correspondante, toutes les valeurs vaudront NULL. Et si elle en possède plusieurs, il y a aura autant de résultat que de données correspondantes, même si les données de la première table doivent être dupliquées.

LEFT JOIN

LEFT JOIN veut bien dire ici une jointure par la gauche, la table de gauche étant la table principale, cette jointure se base donc sur la table main_table pour établir sa jointure.
On sélectionne donc toutes les entrées de main_table et on les joint la table joined_table qu’il y ait une correspondance ou non. C’est implicitement un LEFT OUTER JOIN.

RIGHT JOIN

Vous pouvez maintenant déduire ce qu’est une RIGHT JOIN, la table de droite étant la table jointe.
On sélectionne donc toutes les entrées de main_table et on les joint la table joined_table qu’il y ait une correspondance ou non. C’est implicitement un RIGHT OUTER JOIN.

INNER JOIN

Le mot INNER correspond à l’intersection entre les deux tables, cette jointure rend donc la correspondance nécessaire pour obtenir des résultats.
Cette jointure permet de récupérer tous les résultats depuis la table main_table uniquement si elle possède une correspondance dans joined_table.

FULL OUTER JOIN

OUTER signifie lui que nous souhaitons récupérer l’union des 2 table, en opposition avec INNER JOIN. LEFT JOIN et RIGHT JOIN sont déjà implicitement des LEFT OUTER JOIN et RIGHT OUTER JOIN.
Mais à cela vient s’ajouter le FULL OUTER JOIN, qui nous permet de sélectionner toutes les entrées de main_table jointes à la table joined_table qu’il y ait une correspondance ou non. On récupère donc toutes les entrées des deux tables, rien n’est exclu.

Cas d’usage

En pratique, on utilise généralement les LEFT Join et les INNER Join mais il est fréquent de les voir mal utilisés, parfois inversés, il est important de savoir au préalable si on souhaite récupérer toutes les entrées de main_table ou seulement celles ayant une correspondance avec joined_table.

Source: stackoverflow.com

Florent

Je suis un développeur web à mon compte et je m'intéresse à beaucoup de choses en informatique...

1Commenter

Commenter