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?
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,
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 .
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
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
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.
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.
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.