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.
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 .
2 votes
Le lien de mon 1er commentaire est externe, mais i.stack.imgur.com a des copies permanentes de ses illustrations de sortie (et non entrée) pour intérieur , gauche & complet rejoint (en vert).