5175 votes

Quelle est la différence entre "INNER JOIN" et "OUTER JOIN" ?

Aussi, comment LEFT JOIN , RIGHT JOIN et FULL JOIN s'intégrer ?

87 votes

Des réponses & commentaires & leurs références ci-dessous seulement un explique en fait comment les diagrammes de Venn représentent les opérateurs : La zone d'intersection des cercles représente l'ensemble des lignes de A JOIN B. La zone propre à chaque cercle représente l'ensemble des lignes que l'on obtient en prenant les lignes de sa table qui ne participent pas à A JOIN B et en ajoutant les colonnes propres à l'autre table, toutes définies à NULL. (Et la plupart donnent une vague correspondance bidon des cercles à A et B).

22 votes

@DanteTheSmith Non, cela souffre des mêmes problèmes que les diagrammes ici. Voir mon commentaire ci-dessus concernant la question et ci-dessous concernant ce même article de blog : "Jeff répudie son blog quelques pages plus bas dans les commentaires". Les diagrammes de Venn montrent les éléments d'un ensemble. Essayez d'identifier exactement ce que sont les ensembles et ce que sont les éléments dans ces diagrammes. Les ensembles ne sont pas les tables et les éléments ne sont pas leurs rangs. En outre, deux tables peuvent être jointes, de sorte que les PK et FK sont sans importance. Tout bidon. Vous faites exactement ce que des milliers d'autres ont fait - obtenir un vague impression vous (à tort) supposez a du sens.

2 votes

Mon commentaire précédent porte sur un message confus répudié sur le blog de Jeff Atwood .

6642voto

Mark Harrison Points 77152

En supposant que vous joignez sur des colonnes sans doublons, ce qui est un cas très commun :

  • Une jointure interne de A et B donne le résultat de l'intersection de A et de B, c'est-à-dire la partie interne d'une jointure interne. Diagramme de Venn intersection.

  • Une jointure externe de A et B donne les résultats de l'union de A et B, c'est-à-dire les parties externes d'une union de diagramme de Venn.

Exemples

Supposons que vous ayez deux tableaux, avec une seule colonne chacun, 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

Jointure 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

Jointure extérieure droite

Une jointure extérieure droite donnera 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

Jointure extérieure 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

67 votes

Il serait bon de compléter l'exemple en ajoutant une autre ligne dans le tableau B avec la valeur 4. Cela montrera que les jointures internes ne doivent pas nécessairement porter sur un nombre égal de lignes.

531 votes

Une excellente explication, cependant cette déclaration : Une jointure externe de A et B donne les résultats de l'union de A et B, c'est-à-dire les parties externes d'une union de diagramme de Venn. n'est pas formulé correctement. Une jointure externe donnera les résultats de A intersect B en plus de l'un des résultats suivants : tout A (jointure gauche), tout B (jointure droite) ou tout A et tout B (jointure complète). Seul ce dernier scénario est réellement une union de A et de B. Malgré tout, l'explication est bien écrite.

3 votes

Mais pourquoi dans la colonne b les valeurs ne sont pas dans l'ordre ? c'est à dire 6,5 et non 5,6 ?

2565voto

Teoman shipahi Points 7988

Vous pouvez également considérer le schéma suivant pour différents types de jointures ;

Enter image description here

Source : http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

610voto

ya23 Points 6491

Je recommande Article du blog de Jeff . La meilleure description que j'ai jamais vue, en plus il y a une visualisation, par exemple :

Inner Join :

enter image description here

Jointure extérieure complète :

enter image description here

297voto

gt_ebuddy Points 6551

Le texte suivant est extrait de l'article " MySQL - LEFT JOIN et RIGHT JOIN, INNER JOIN et OUTER JOIN "par Graham Ellis sur son blog Horse's Mouth.

Dans une base de données telle que MySQL, les données sont divisées en un certain nombre de tables qui sont ensuite connectées ( Joined ) ensemble par JOIN sur SELECT pour lire les enregistrements de plusieurs tables. Lisez cet exemple pour voir comment cela fonctionne.

Tout d'abord, quelques exemples de données :

people
    mysql> select * from people;
    +------------+--------------+------+
    | name       | phone        | pid  |
    +------------+--------------+------+
    | Mr Brown   | 01225 708225 |    1 |
    | Miss Smith | 01225 899360 |    2 |
    | Mr Pullen  | 01380 724040 |    3 |
    +------------+--------------+------+
    3 rows in set (0.00 sec)

property
    mysql> select * from property;
    +------+------+----------------------+
    | pid  | spid | selling              |
    +------+------+----------------------+
    |    1 |    1 | Old House Farm       |
    |    3 |    2 | The Willows          |
    |    3 |    3 | Tall Trees           |
    |    3 |    4 | The Melksham Florist |
    |    4 |    5 | Dun Roamin           |
    +------+------+----------------------+
    5 rows in set (0.00 sec)

JOINT REGULIER

Si nous effectuons un JOIN ordinaire (sans aucun des mots-clés INNER, OUTER, LEFT ou RIGHT), nous obtenons tous les enregistrements qui correspondent de la manière appropriée dans les deux tables, et les enregistrements des deux tables entrantes qui ne correspondent pas ne sont pas signalés :

mysql> select name, phone, selling 
from people join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)

JOINT GAUCHE

Si nous faisons un LEFT JOIN, nous obtenons tous les enregistrements qui correspondent de la même manière et EN PLUS nous obtenons un enregistrement supplémentaire pour chaque enregistrement non correspondant dans la table gauche de la jointure - assurant ainsi (dans cet exemple) que chaque PERSONNE est mentionnée :

   mysql> select name, phone, selling 
    from people left join property 
    on people.pid = property.pid; 
    +------------+--------------+----------------------+
    | name       | phone        | selling              |
    +------------+--------------+----------------------+
    | Mr Brown   | 01225 708225 | Old House Farm       |
    | Miss Smith | 01225 899360 | NULL <<-- unmatch    |
    | Mr Pullen  | 01380 724040 | The Willows          |
    | Mr Pullen  | 01380 724040 | Tall Trees           |
    | Mr Pullen  | 01380 724040 | The Melksham Florist |
    +------------+--------------+----------------------+
    5 rows in set (0.00 sec)

JOINT DROIT

Si nous faisons une JOINTURE DROITE, nous obtenons tous les enregistrements qui correspondent et EN PLUS un enregistrement supplémentaire pour chaque enregistrement non correspondant dans la table droite de la jointure - dans mon exemple, cela signifie que chaque propriété est mentionnée même si nous n'avons pas les détails du vendeur :

mysql> select name, phone, selling 
from people right join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL      | NULL         | Dun Roamin           |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)

Un INNER JOIN effectue une jointure complète, comme dans le premier exemple, et le mot OUTER peut être ajouté après le mot LEFT ou RIGHT dans les deux derniers exemples - il est fourni pour la compatibilité ODBC et n'ajoute pas de capacités supplémentaires.

175voto

Tushar Gupta Points 28215

Jointure interne

Récupérer uniquement les rangées correspondantes, c'est-à-dire, A intersect B .

Enter image description here

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Jointure extérieure gauche

Sélectionnez tous les enregistrements de la première table, et tous les enregistrements de la seconde qui correspondent aux clés jointes.

Enter image description here

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Jointure externe complète

Sélectionnez tous les enregistrements de la deuxième table, et tous les enregistrements de la première table qui correspondent aux clés jointes.

Enter image description here

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Références

16 votes

Quel est le nom de l'outil ? Je le trouve intéressant car il montre le nombre de lignes et de venn-diagrammes.

3 votes

@GrijeshChauhan Ouais mais vous pouvez essayer de l'exécuter en utilisant vin .

2 votes

Ohh ! oui je ..j'ai utilisé SQLyog en utilisant le vin il y a aussi PlayOnLinux

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X