Y a-t-il un piège ? Oui, il y en a un : les jointures gauches sont une forme de jointure externe, tandis que les jointures internes sont une forme de, eh bien, de jointure interne.
Voici des exemples qui montrent la différence. Nous allons commencer par les données de base :
mysql> select * from j1;
+----+------------+
| id | thing |
+----+------------+
| 1 | hi |
| 2 | hello |
| 3 | guten tag |
| 4 | ciao |
| 5 | buongiorno |
+----+------------+
mysql> select * from j2;
+----+-----------+
| id | thing |
+----+-----------+
| 1 | bye |
| 3 | tschau |
| 4 | au revoir |
| 6 | so long |
| 7 | tschuessi |
+----+-----------+
Et ici, nous allons voir la différence entre une jointure interne et une jointure gauche :
mysql> select * from j1 inner join j2 on j1.id = j2.id;
+----+-----------+----+-----------+
| id | thing | id | thing |
+----+-----------+----+-----------+
| 1 | hi | 1 | bye |
| 3 | guten tag | 3 | tschau |
| 4 | ciao | 4 | au revoir |
+----+-----------+----+-----------+
Hmm, 3 rangs.
mysql> select * from j1 left join j2 on j1.id = j2.id;
+----+------------+------+-----------+
| id | thing | id | thing |
+----+------------+------+-----------+
| 1 | hi | 1 | bye |
| 2 | hello | NULL | NULL |
| 3 | guten tag | 3 | tschau |
| 4 | ciao | 4 | au revoir |
| 5 | buongiorno | NULL | NULL |
+----+------------+------+-----------+
Wow, 5 rangs ! Que s'est-il passé ?
Les jointures extérieures telles que left join
préserver les lignes qui ne correspondent pas -- ainsi les lignes avec les identifiants 2 et 5 sont préservées par la requête de jointure gauche. Les autres colonnes sont remplies de NULL.
En d'autres termes, les jointures gauche et intérieure ne sont pas interchangeables.