De même, quelle est la place de LEFT JOIN
, RIGHT JOIN
et FULL JOIN
?
En supposant que vous faites une jointure sur des colonnes sans doublons, ce qui est un cas très courant :
Une jointure interne de A et B donne le résultat de A intersect B, c'est-à-dire la partie interne d'une intersection de [diagramme de Venn][1].
Une jointure externe de A et B donne les résultats de A union B, c'est-à-dire les parties externes d'une union de diagramme de Venn.
Exemples
Supposons que vous ayez deux tables, avec une seule colonne chacune, et des données comme suit :
A B
- -
1 3
2 4
3 5
4 6
Notez que (1,2) sont uniques à A, (3,4) sont communs, et (5,6) sont uniques à B.
Jointure interne
Une jointure interne utilisant l'une ou l'autre des requêtes équivalentes donne l'intersection des deux tables, c'est-à-dire les deux lignes qu'elles ont en commun.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Jonction externe gauche
Une jointure externe gauche donnera toutes les lignes de A, plus toutes les lignes communes de B.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
Jonction externe droite
Une jointure externe droite donne toutes les lignes de B, plus toutes les lignes communes de A.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
Jonction externe complète
Une jointure externe complète vous donnera l'union de A et B, c'est-à-dire toutes les lignes de A et toutes les lignes de B. Si un élément de A n'a pas de donnée correspondante dans B, alors la partie B est nulle, et vice versa.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
Une jointure interne n'affiche des lignes que s'il existe un enregistrement correspondant de l'autre côté (droit) de la jointure.
Une jointure externe (gauche) affiche des lignes pour chaque enregistrement du côté gauche, même s'il n'y a pas de lignes correspondantes de l'autre côté (droit) de la jointure. S'il n'y a pas de ligne correspondante, les colonnes de l'autre côté (droit) afficheront NULL.
Les jointures internes exigent qu'un enregistrement avec un ID lié existe dans la table jointe.
Les jointures externes renvoient des enregistrements pour le côté gauche même si rien n'existe pour le côté droit.
Par exemple, vous avez une table Orders et une table OrderDetails. Elles sont liées par un "OrderID".
Commandes
Détails de la commande
La demande
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
ne renverra que les commandes qui ont également quelque chose dans la table OrderDetails.
Si vous le changez en OUTER LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
il renverra les enregistrements de la table Orders même s'ils ne contiennent pas d'enregistrements OrderDetails.
Vous pouvez utiliser cette méthode pour trouver les commandes qui n'ont pas de OrderDetails, ce qui indique une possible commande orpheline, en ajoutant une clause where comme WHERE OrderDetails.OrderID IS NULL
.