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

35

Je suis nouveau sur SQL et je voulais savoir quelle est la différence entre ces deux JOINtypes?

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

Quand devrais-je utiliser l'un ou l'autre?

Julien
la source
6
Est-ce que cela convient comme question de DBA? Cela me semble être une question de codage.
BlackICE
1
@David votre opinion sur Meta
Sathyajith Bhat le
@ David alors VtC si vous pensez que c'est mauvais pour le site. Nous pouvons toujours rouvrir.
jcolebrand
3
Je pense que c'est une excellente question, et très appropriée pour le site.
datagod
cette nécessité doit être déplacée de DBA sans qu'un administrateur de base de données ne soit ajusté pour ajuster les performances de la base de données: P
AmDB

Réponses:

32
  • Une jointure interne ne sélectionnera que les enregistrements dans lesquels les clés jointes se trouvent dans les deux tables spécifiées.
  • Une jointure externe gauche sélectionnera tous les enregistrements de la première table et tous les enregistrements de la seconde table correspondant aux clés jointes.
  • Une jointure externe droite sélectionnera tous les enregistrements de la seconde table et tous les enregistrements de la première table correspondant aux clés jointes.

Dans votre premier exemple, vous ne renverrez une liste d'utilisateurs et des numéros de téléphone que si au moins un enregistrement téléphonique existe pour l'utilisateur.

Dans votre deuxième exemple, vous renverrez une liste de tous les utilisateurs, ainsi que tous les enregistrements téléphoniques s'ils sont disponibles (s'ils ne sont pas disponibles, vous obtiendrez NULLles valeurs de téléphone).

LittleBobbyTables
la source
13

Chaque fois que quelqu'un pose cette question, il y a une réponse: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

J'espère que cela vous aidera à comprendre,

Spredzy
la source
3
Je travaille avec des jointures depuis 20 ans et ces diagrammes me semblaient déroutants.
Hogan
3
Je suis avec @Hogan - les diagrammes ven ne sont pas la meilleure explication pour cela .. une grille montrant les combinaisons qui seraient renvoyées serait probablement meilleure.
Joe
Tout ce que cela montre, c'est que vous ne comprenez pas un diagramme de Venn. Ils se rapportent parfaitement aux types de jointure, mais gardez à l’esprit qu’ils sont un outil d’aide à la compréhension pour les nouveaux venus. Si vous avez déjà appris la jonction avec un concept différent à l’esprit, il vous semblera alors peu familier. Ce n’est pas un problème, mais ce n’est pas non plus un bon indicateur de l’utilité des diagrammes.
JamesRyan
@jamesryan ce n'est pas vrai, ils ne se lient pas parfaitement, les jointures ressemblent à un produit cartésien d'ensembles, pas d'intersection et d'union, l'analogue du diagramme de Venn ne fonctionne que si vous joignez des clés uniques, si vous avez des clés dupliquées, puis vous perdez l'aspect produit cartésien.
Will
1
Je suis tout à fait en désaccord, car les diagrammes venn ont déjà une interprétation très bien définie, définissent des intersections et des unions. Les jointures ne correspondent pas à cette interprétation lorsque vous joignez des clés non uniques. Je pense que vous interprétez les diagrammes de Venn de manière trop large.
Will
8

Une jointure interne renvoie des lignes qui peuvent être combinées en fonction des critères de jointure.
Une jointure externe renvoie ces lignes et toutes les lignes ...
   ... de la première table pour une jointure gauche
   ... de la deuxième table pour une jointure droite
   ... des deux tables pour une jointure complète

Choisir le moment d'utiliser l'une ou l'autre dépend du type de données dont vous avez besoin. Par exemple, si vous n'avez besoin que des enregistrements dont les identifiants utilisateur de téléphone correspondent à ceux de l'utilisateur, utilisez la jointure interne. Si vous souhaitez également inclure des lignes provenant d'utilisateurs dont l'entrée téléphonique ne correspond pas, la jointure gauche est appropriée.

Pour plus d'informations, voir cette question sur StackOverflow .

Leigh Riffel
la source
7

Si vous avez 2 tables comme ci-dessous:

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2

Si vous utilisez Inner Join, vous obtenez:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2

Si vous utilisez une connexion externe complète, vous obtenez:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1

Si vous utilisez Left Outer Join, vous obtenez:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
Am1rr3zA
la source
6

La jointure externe est expressément conçue pour produire des valeurs nuls dans son résultat et doit donc être évitée en général. D'un point de vue relationnel, il s'agit d'une sorte de mariage forcé: cela force les tables à former une sorte d'union - oui, je veux dire une union, pas à adhérer - même lorsque les tables en question ne sont pas conformes aux exigences habituelles de l'union. Pour ce faire, il remplit une ou les deux tables avec des valeurs NULL avant de créer l’union, les rendant ainsi conformes à ces exigences habituelles. Mais il n'y a aucune raison pour que ce remplissage ne soit pas effectué avec des valeurs correctes au lieu de valeurs nulles, comme dans cet exemple:

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )

Sinon, le même résultat pourrait être obtenu en utilisant l'opérateur de jointure externe SQL en conjonction avec COALESCE, comme ici:

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP

Remarque sur la jointure externe (4.6) dans "SQL et la théorie relationnelle: comment écrire un code SQL précis" par CJ Date

un jour quand
la source
5

Une jointure interne est une jointure dans laquelle les seuls résultats affichés sont des résultats dans lesquels les clés figurent dans les deux tables. Une jointure externe affichera les résultats de toutes les clés d'une table, une jointure gauche de la première et une jointure droite de la seconde. Par exemple:

Supposons que table1 comporte les paires de clé primaire et de données suivantes: (1, a), (2, b), (3, c)

Supposons également que table2 possède les paires de clé primaire et de données suivantes: (1, amusant), (3, peut), (4, arrive)

Ainsi, une jointure interne de table1 à table2 sur les clés primaires donnerait les triplets résultants (avec la clé primaire commune en premier, le deuxième élément de la première table en second et le deuxième élément de la deuxième en troisième): (1, a, fun), ( 3, c, peut)

Une jointure externe gauche de table1 à table2 sur les clés primaires donnerait les triplets suivants (même format que ci-dessus): (1, a, fun), (2, b, NULL), (3, c, peut)

Une jointure externe droite de table1 à table2 sur les clés primaires donnerait les triplets suivants (même format que ci-dessus): (1, a, fun), (3, c, peut), (4, NULL, arrive)

J'espère que cela explique le concept décemment bien.

indyK1ng
la source
4

Laissez-moi essayer de le décrire un peu plus intuitivement.

La jointure interne montre les utilisateurs qui ont un ou plusieurs téléphone (s) avec leur numéro de téléphone.

La jointure externe gauche liste en outre les "utilisateurs" qui n'ont pas de téléphone.

Bernd_k
la source
4

Puisque vous avez demandé quand utiliser quoi, voici un scénario avec des requêtes - sélectionnez lequel utiliser en fonction des besoins.

Les données:

Utilisateurs de table a 10 enregistrements. La table Phoneno a 6 enregistrements (avec une relation 1: 1, ce qui signifie qu'une entrée dans PhoneNo ne fera référence qu'à une entrée dans Utilisateurs et qu'une seule entrée dans PhoneNo peut référencer une entrée donnée dans Utilisateurs).

Condition 1: Afficher tous les utilisateurs avec leurs numéros de téléphone. Ignorer les utilisateurs sans numéro de téléphone.

Question:

SELECT u.uid, u.name, p.phonno 
  FROM user u 
INNER JOIN phones p ON p.uid = u.uid

Résultat: montre 6 utilisateurs qui ont un numéro de téléphone

Condition 2: Afficher tous les utilisateurs avec leur numéro de téléphone. Si l'utilisateur n'a pas d'affichage du téléphone, 'N ​​/ A' (non disponible)

Question:

SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
  FROM user u 
LEFT OUTER JOIN phones p ON p.uid = u.uid

Résultat:

Affiche tous les 10 enregistrements

Remarque: ifnull est une syntaxe MySql pour transformer la valeur null. J'ai utilisé cette fonction pour que le moteur de base de données indique 'N / A' lorsque phonno a la valeur null. Recherchez la fonction appropriée si vous utilisez un autre SGBD. Dans SQL Server, vous devez utiliser l' CASEinstruction.

J'espère que ça aide.

AmDB
la source