44 votes

Quand utiliser LEFT JOIN et quand utiliser INNER JOIN ?

J'ai l'impression qu'on m'a toujours appris à utiliser LEFT JOIN et je les vois souvent mélangés à des INNER pour accomplir le même type de requête à travers plusieurs morceaux de code qui sont censés faire la même chose sur différentes pages. C'est parti :

SELECT ac.reac, pt.pt_name, soc.soc_name, pt.pt_soc_code
FROM
  AECounts ac
  INNER JOIN 1_low_level_term llt on ac.reac = llt.llt_name
  LEFT JOIN 1_pref_term pt ON llt.pt_code = pt.pt_code
  LEFT JOIN 1_soc_term soc ON pt.pt_soc_code = soc.soc_code
LIMIT 100,10000

C'est celui sur lequel je travaille :

Je vois beaucoup de choses comme ça :

SELECT COUNT(DISTINCT p.`case`) as count
FROM FDA_CaseReports cr
  INNER JOIN ae_indi i ON i.isr = cr.isr
  LEFT JOIN ae_case_profile p ON cr.isr = p.isr

On dirait que le LEFT peut aussi bien être INNER, y a-t-il un piège ?

133voto

Matt Fenwick Points 17097

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.

12voto

rob Points 804

Voici une réponse approximative, c'est en quelque sorte la façon dont je pense aux jointures. J'espère que cela sera plus utile qu'une réponse très précise en raison des problèmes mathématiques susmentionnés... ;-)

Les jointures internes réduisent l'ensemble des retours de lignes. Les jointures externes (gauche ou droite) ne modifient pas le nombre de lignes retournées, mais "récupèrent" des colonnes supplémentaires si possible.

Dans votre premier exemple, le résultat sera des lignes provenant de AECounts qui correspondent aux conditions spécifiées à la 1_low_level_term table. Ensuite, pour ces lignes, il essaie à rejoindre à 1_pref_term y 1_soc_term . Mais s'il n'y a pas de correspondance, les lignes restent et les colonnes jointes sont nulles.

7voto

philf2b Points 171

Un INNER JOIN ne renverra que les lignes où il y a des valeurs correspondantes dans les deux tables, alors qu'un LEFT JOIN renverra TOUTES les lignes de la table LEFT, même s'il n'y a pas de ligne correspondante dans la table RIGHT.

Un exemple rapide

TableA
ID   Value
1    TableA.Value1
2    TableA.Value2
3    TableA.Value3

TableB
ID   Value
2    TableB.ValueB
3    TableB.ValueC

Un INNER JOIN produit :

SELECT a.ID,a.Value,b.ID,b.Value 
FROM TableA a INNER JOIN TableB b ON b.ID = a.ID

a.ID    a.Value            b.ID    b.Value
2       TableA.Value2      2       TableB.ValueB
3       TableA.Value3      3       TableB.ValueC

A LEFT JOIN produit :

SELECT a.ID,a.Value,b.ID,b.Value 
FROM TableA a LEFT JOIN TableB b ON b.ID = a.ID

a.ID    a.Value            b.ID    b.Value
1       TableA.Value1      NULL    NULL
2       TableA.Value2      2       TableB.ValueB
3       TableA.Value3      3       TableB.ValueC

Comme vous pouvez le voir, le LEFT JOIN inclut la ligne de la TableA où l'ID = 1 même si aucune ligne correspondante de la TableB n'a l'ID = 1, alors que le INNER JOIN exclut la ligne spécifiquement parce qu'il n'y a aucune ligne correspondante dans la TableB.

HTH

4voto

Seung Bae Im Points 21

Utilisez une jointure interne lorsque vous voulez uniquement les résultats qui apparaissent dans les deux tables qui correspondent à la condition de la jointure.

Utilisez une jointure gauche lorsque vous souhaitez obtenir tous les résultats de la table A, mais que la table B contient des données pertinentes pour certains des enregistrements de la table A, vous souhaitez également utiliser ces données dans la même requête.

Utilisez une jointure complète lorsque vous voulez tous les résultats des deux tables.

3voto

Scott Points 108

Pour les débutants, parce que cela m'a aidé lorsque j'en étais un : un INNER JOIN est toujours un sous-ensemble d'un LEFT ou d'un RIGHT JOIN, et tous ces éléments sont toujours des sous-ensembles d'un FULL JOIN. Cela m'a aidé à comprendre l'idée de base.

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