J'ai 2 tableaux comme celui-ci :
> SELECT * FROM table_a;
+------+------+
| id | name |
+------+------+
| 1 | row1 |
| 2 | row2 |
+------+------+
> SELECT * FROM table_b;
+------+------+------+
| id | name | aid |
+------+------+------+
| 3 | row3 | 1 |
| 4 | row4 | 1 |
| 5 | row5 | NULL |
+------+------+------+
INNER JOIN s'intéresse aux deux tables
INNER JOIN s'intéresse aux deux tables, donc vous n'obtenez une ligne que si les deux tables en ont une. S'il y a plus d'une paire correspondante, vous obtenez plusieurs lignes.
> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
+------+------+------+------+------+
Cela ne fait aucune différence pour INNER JOIN si vous inversez l'ordre, car il s'intéresse aux deux tables :
> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
+------+------+------+------+------+
Vous obtenez les mêmes lignes, mais les colonnes sont dans un ordre différent parce que nous avons mentionné les tables dans un ordre différent.
LEFT JOIN ne s'intéresse qu'à la première table.
LEFT JOIN se soucie de la première table que vous lui donnez, et ne se soucie pas beaucoup de la seconde, donc vous obtenez toujours les lignes de la première table, même s'il n'y a pas de ligne correspondante dans la seconde :
> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| 2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+
Au-dessus, vous pouvez voir toutes les lignes de la table_a même si certaines d'entre elles ne correspondent à rien dans la table b, mais pas toutes les lignes de la table_b - seulement celles qui correspondent à quelque chose dans la table_a.
Si nous inversons l'ordre des tables, LEFT JOIN se comporte différemment :
> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| 5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+
Nous obtenons maintenant toutes les lignes de la table_b, mais seulement les lignes correspondantes de la table_a.
RIGHT JOIN ne s'intéresse qu'à la deuxième table.
a RIGHT JOIN b
vous donne exactement les mêmes rangs que b LEFT JOIN a
. La seule différence est l'ordre par défaut des colonnes.
> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| NULL | NULL | 5 | row5 | NULL |
+------+------+------+------+------+
Il s'agit des mêmes rangs que table_b LEFT JOIN table_a
que nous avons vu dans la section LEFT JOIN.
De même :
> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| NULL | NULL | NULL | 2 | row2 |
+------+------+------+------+------+
Il s'agit des mêmes rangs que table_a LEFT JOIN table_b
.
Pas de jointure du tout vous donne des copies de tout
Si vous écrivez vos tableaux sans aucune clause JOIN, en les séparant simplement par des virgules, vous obtenez chaque ligne du premier tableau écrite à côté de chaque ligne du second tableau, dans toutes les combinaisons possibles :
> SELECT * FROM table_b b, table_a;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 3 | row3 | 1 | 2 | row2 |
| 4 | row4 | 1 | 1 | row1 |
| 4 | row4 | 1 | 2 | row2 |
| 5 | row5 | NULL | 1 | row1 |
| 5 | row5 | NULL | 2 | row2 |
+------+------+------+------+------+
(Ceci est tiré de mon article de blog Exemples de types de jointures SQL )