SQL : quelle est la différence entre INNER JOIN et OUTER JOIN ?

Ces clauses permettent de lier des tables entre elles lors d'un SELECT grâce à des jointures. Voici leurs principales différences.

En SQL, il est possible de lier des tables entre elles lors d'un SELECT grâce à des jointures. Celles-ci peuvent être faites avec les clauses INNER JOIN et OUTER JOIN. Ces clauses n'ont pas le même effet sur la liaison effectuée entre les tables. La clause OUTER JOIN possède en plus plusieurs variantes : LEFT OUTER JOIN, RIGHT OUTER JOIN et FULL OUTER JOIN.

Supposons qu'il y ait deux tables, table_A et table_B qui ont toutes les deux une colonne id, dont on se sert pour effectuer la jointure. Dans la table table_A, on trouve comme valeurs 1 et 2 alors que dans la table table_B il y a les valeurs 2 et 3.

La clause INNER JOIN va retourner les enregistrements présents dans les deux tables. Dans l'exemple, il y aura un enregistrement retourné avec comme valeur 2.

Requête :
SELECT a.id, b.id FROM table_A INNER JOIN table_B on table_A.id = table_B.id;
Résultat :
table_A | table_B
2 | 2

La clause LEFT OUTER JOIN va retourner tous les enregistrements de la table table_A ainsi que ceux en commun de la table table_B. Pour les enregistrements de la table table_A qui n'ont pas de valeur correspondante dans la table table_B, la valeur null sera retournée.

Requête :
SELECT a.id, b.id FROM table_A LEFT OUTER JOIN table_B on table_A.id = table_B.id;
Résultat :
table_A | table_B
1 | null
2 | 2

La clause RIGHT OUTER JOIN retournera tous les enregistrements de la table table_B avec les enregistrements correspondants dans la table table_A. Si aucune valeur correspondante n'est trouvée, la valeur null sera retournée à la place.

Requête :
SELECT a.id, b.id FROM table_A RIGHT OUTER JOIN table_B on table_A.id = table_B.id;
Résultat :
table_A | table_B
2 | 2
Null | 3

La clause FULL OUTER JOIN retourne tous les enregistrements de la table table_A et de la table table_B. La valeur null est utilisée lorsque l'enregistrement d'une table ne correspond pas à un enregistrement stocké dans l'autre table.
Requête :

SELECT a.id, b.id FROM table_A FULL OUTER JOIN table_B on table_A.id = table_B.id;
Résultat :
table_A | table_B
1 | null
2 | 2
Null | 3

SQL