Je suis nouveau sur SQL et je voulais savoir quelle est la différence entre ces deux JOIN
types?
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?
Réponses:
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
NULL
les valeurs de téléphone).la source
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,
la source
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 .
la source
Si vous avez 2 tables comme ci-dessous:
Si vous utilisez Inner Join, vous obtenez:
Si vous utilisez une connexion externe complète, vous obtenez:
Si vous utilisez Left Outer Join, vous obtenez:
la source
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:
Sinon, le même résultat pourrait être obtenu en utilisant l'opérateur de jointure externe SQL en conjonction avec
COALESCE
, comme ici:Remarque sur la jointure externe (4.6) dans "SQL et la théorie relationnelle: comment écrire un code SQL précis" par CJ Date
la source
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.
la source
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.
la source
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:
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:
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'
CASE
instruction.J'espère que ça aide.
la source