web-dev-qa-db-fra.com

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

Je suis nouveau dans SQL et je voulais savoir quelle est la différence entre ces deux types JOIN?

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 dois-je utiliser l'un ou l'autre?

35
Julien
  • Un jointure interne ne sélectionnera que les enregistrements où les clés jointes se trouvent dans les deux tables spécifiées.
  • Un jointure externe gauche sélectionnera tous les enregistrements de la première table et tous les enregistrements de la deuxième table qui correspondent aux clés jointes.
  • A jointure externe droite sélectionnera tous les enregistrements de la deuxième table et tous les enregistrements de la première table qui correspondent aux clés jointes.

Dans votre premier exemple, vous ne renverrez une liste d'utilisateurs et de 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 retournerez une liste de tous utilisateurs, plus tous les enregistrements téléphoniques s'ils sont disponibles (s'ils ne sont pas disponibles, vous obtiendrez NULL pour le téléphone valeurs).

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

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

13
Spredzy

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 ...
... du premier tableau pour une jointure gauche
... du deuxième tableau pour une jointure droite
... des deux tables pour une jointure complète

Choisir quand utiliser l'un ou l'autre est une question de déterminer les données dont vous avez besoin. Pour votre exemple, si vous n'avez besoin que d'enregistrements dont les ID utilisateur provenant du téléphone correspondent aux ID de l'utilisateur, utilisez la jointure interne. Si vous souhaitez également inclure des lignes de l'utilisateur qui n'ont aucune entrée téléphonique correspondante, la jointure gauche serait appropriée.

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

8
Leigh Riffel

Si vous avez 2 tableaux 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 la jointure 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
7
Am1rr3zA

La jointure externe est expressément conçue pour produire des valeurs nulles dans son résultat et doit donc être évitée, en général. Relativement parlant, c'est une sorte de mariage au fusil de chasse: il oblige les tables à une sorte d'union - oui, je veux dire l'union, pas l'adhésion - même lorsque les tables en question ne sont pas conformes aux exigences habituelles de l'union. Il le fait, en effet, en remplissant une ou les deux tables avec des valeurs nulles avant de faire l'union, les rendant ainsi conformes à ces exigences habituelles après tout. Mais il n'y a aucune raison pour que ce remplissage ne soit pas effectué avec des valeurs appropriées au lieu de null, 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 )

Alternativement, le même résultat pourrait être obtenu en utilisant l'opérateur de jointure externe SQL conjointement 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 théorie relationnelle: comment écrire un code SQL précis" par C.J. Date

6
onedaywhen

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

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

Disons également que table2 a la clé primaire et les paires de données suivantes: (1, amusant), (3, peut), (4, arrive)

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

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

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

J'espère que cela explique assez bien le concept.

5
indyK1ng

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

Les données:

Les utilisateurs de table ont 10 enregistrements. La table Phoneno a 6 enregistrements (avec une relation 1: 1, ce qui signifie qu'une entrée dans PhoneNo ne référencera qu'une seule entrée dans Users, et qu'une seule entrée dans PhoneNo peut référencer une entrée donnée dans Users).

Condition 1: montrer à tous les utilisateurs leurs numéros de téléphone. Ignorez les utilisateurs sans numéro de téléphone.

Requete:

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

Résultat: affiche 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 de téléphone 'N/A' (non disponible)

Requete:

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 les 10 enregistrements

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

J'espère que ça aide.

4
AmDB

Permettez-moi d'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 (s) numéro (s) de téléphone.

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

4
bernd_k