Aussi comment faire LEFT JOIN
, RIGHT JOIN
et FULL JOIN
dans tout ça?
sql
database
join
inner-join
outer-join
Chris de Vries
la source
la source
Réponses:
En supposant que vous vous joignez à des colonnes sans doublons, ce qui est un cas très courant:
Une jointure intérieure de A et B donne le résultat d'une intersection de A B, c'est-à-dire la partie intérieure d'une intersection de diagramme de Venn .
Une jointure externe de A et B donne les résultats de l'union B, c'est-à-dire les parties externes d'une union de diagramme de Venn.
Exemples
Supposons que vous ayez deux tables, avec une seule colonne chacune, et les données comme suit:
Notez que (1,2) sont uniques à A, (3,4) sont communs et (5,6) sont uniques à B.
Jointure interne
Une jointure interne utilisant l'une des requêtes équivalentes donne l'intersection des deux tables, c'est-à-dire les deux lignes qu'elles ont en commun.
Jointure externe gauche
Une jointure externe gauche donnera toutes les lignes dans A, plus toutes les lignes communes dans B.
Jointure extérieure droite
Une jointure externe droite donnera toutes les lignes en B, plus toutes les lignes communes en A.
Jointure externe complète
Une jointure externe complète vous donnera l'union de A et B, c'est-à-dire toutes les lignes dans A et toutes les lignes dans B. Si quelque chose dans A n'a pas de donnée correspondante dans B, alors la partie B est nulle, et vice inversement.
la source
Les diagrammes de Venn ne le font pas vraiment pour moi.
Ils ne montrent aucune distinction entre une jointure croisée et une jointure interne, par exemple, ou plus généralement ne montrent aucune distinction entre différents types de prédicat de jointure ou fournissent un cadre pour raisonner sur la façon dont ils fonctionneront.
Il n'y a pas de substitut à la compréhension du traitement logique et il est de toute façon relativement simple à saisir.
on
clause par rapport à toutes les lignes de l'étape 1 en conservant celles où le prédicat est évalué.true
(NB: en pratique, l'optimiseur de requêtes peut trouver des moyens plus efficaces d'exécuter la requête que la description purement logique ci-dessus mais le résultat final doit être le même)
Je vais commencer par une version animée d'une jointure externe complète . D'autres explications suivent.
Explication
Tableaux source
Commencez d'abord par un
CROSS JOIN
(produit cartésien AKA). Cela n'a pas deON
clause et renvoie simplement chaque combinaison de lignes des deux tables.SÉLECTIONNEZ A.Couleur, B.COLORE À PARTIR D'UNE CROIX JOIGNEZ B
Les jointures internes et externes ont un prédicat de clause "ON".
Quelques exemples
SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UN JOINT INTÉRIEUR B SUR A.Colour = B.Colour
Ce qui précède est la jointure équi classique.
Version animée
SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UN INTÉRIEUR JOIGNEZ B SUR A.Colour NOT IN ('Vert', 'Bleu')
La condition de jointure interne ne doit pas nécessairement être une condition d'égalité et elle n'a pas besoin de référencer des colonnes des deux (ou même des deux) des tables. Évaluation
A.Colour NOT IN ('Green','Blue')
sur chaque ligne du retour de jointure croisée.SÉLECTIONNEZ A.Couleur, B.Couleur À PARTIR D'UN INTÉRIEUR JOINDRE B SUR 1 = 1
La condition de jointure a la valeur true pour toutes les lignes du résultat de la jointure croisée, c'est donc la même chose qu'une jointure croisée. Je ne répéterai pas l'image des 16 lignes.
SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UNE GAUCHE EXTÉRIEURE JOINDRE B SUR A.Colour = B.Colour
Les jointures externes sont évaluées logiquement de la même manière que les jointures internes, sauf que si une ligne de la table de gauche (pour une jointure de gauche) ne se joint à aucune ligne de la table de droite, elle est conservée dans le résultat avec des
NULL
valeurs pour le colonnes de droite.SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UNE GAUCHE EXTÉRIEURE JOIGNEZ B SUR A.Colour = B.Colour O B. B.Colour EST NULL
Cela limite simplement le résultat précédent pour ne renvoyer que les lignes où
B.Colour IS NULL
. Dans ce cas particulier, ce seront les lignes qui ont été conservées car elles ne correspondaient pas dans le tableau de droite et la requête renvoie la seule ligne rouge non correspondante dans le tableauB
. C'est ce qu'on appelle un anti semi jointure.Il est important de sélectionner une colonne pour le
IS NULL
test qui ne soit pas annulable ou pour laquelle la condition de jointure garantit que toutes lesNULL
valeurs seront exclues pour que ce modèle fonctionne correctement et éviter de simplement ramener des lignes qui se trouvent avoir uneNULL
valeur pour cela. en plus des lignes non appariées.SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UN DROIT EXTÉRIEUR JOINDRE B SUR A.Colour = B.Colour
Les jointures externes droites agissent de la même manière que les jointures externes gauche, sauf qu'elles conservent les lignes non correspondantes du tableau de droite et étendent null les colonnes de gauche.
SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UN EXTÉRIEUR COMBINER B SUR A.Colour = B.Colour
Les jointures externes complètes combinent le comportement des jointures gauche et droite et préservent les lignes non correspondantes des tables gauche et droite.
SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UNE EXTÉRIEURE COMPLÈTE JOINDRE B SUR 1 = 0
Aucune ligne de la jointure croisée ne correspond au
1=0
prédicat. Toutes les lignes des deux côtés sont conservées à l'aide des règles de jointure externe normales avec NULL dans les colonnes du tableau de l'autre côté.CHOISIR COALESCE (A.Colour, B.Colour) COMME COULEUR À PARTIR D'UNE EXTÉRIEURE COMPLÈTE JOINDRE B SUR 1 = 0
Avec une modification mineure de la requête précédente, on pourrait simuler l'une
UNION ALL
des deux tables.SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UNE GAUCHE EXTÉRIEURE JOIGNEZ B SUR A.Colour = B.Colour OERE B.Colour = 'Green'
Notez que la
WHERE
clause (si présente) s'exécute logiquement après la jointure. Une erreur courante consiste à effectuer une jointure externe gauche, puis à inclure une clause WHERE avec une condition sur la table de droite qui finit par exclure les lignes non correspondantes. Ce qui précède finit par effectuer la jointure externe ...... Et puis la clause "Where" s'exécute.
NULL= 'Green'
n'évalue pas true donc la ligne conservée par la jointure externe finit par être rejetée (avec la bleue) en convertissant efficacement la jointure en une interne.Si l'intention était d'inclure uniquement les lignes de B où Color est vert et toutes les lignes de A, quelle que soit la syntaxe correcte,
SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UNE GAUCHE EXTÉRIEURE JOIGNEZ B SUR A.Colour = B.Colour ET B.Colour = 'Green'
SQL Fiddle
Découvrez ces exemples en direct sur SQLFiddle.com .
la source
Les jointures sont utilisées pour combiner les données de deux tables, le résultat étant une nouvelle table temporaire. Les jointures sont effectuées sur la base d'un élément appelé prédicat, qui spécifie la condition à utiliser pour effectuer une jointure. La différence entre une jointure interne et une jointure externe est qu'une jointure interne ne renverra que les lignes qui correspondent réellement en fonction du prédicat de jointure. Par exemple, considérons le tableau des employés et des emplacements:
Jointure interne: - La jointure interne crée une nouvelle table de résultats en combinant les valeurs de colonne de deux tables ( employé et emplacement ) en fonction du prédicat de jointure. La requête compare chaque ligne d' employé à chaque ligne d' emplacement pour trouver toutes les paires de lignes qui satisfont le prédicat de jointure. Lorsque le prédicat de jointure est satisfait en faisant correspondre des valeurs non NULL, les valeurs de colonne pour chaque paire de lignes de l' employé et de l' emplacement correspondant sont combinées dans une ligne de résultat. Voici à quoi ressemblera le SQL d'une jointure interne:
Maintenant, voici à quoi ressemblerait le résultat de l'exécution de SQL:
Jointure externe: - Une jointure externe ne nécessite pas que chaque enregistrement des deux tables jointes ait un enregistrement correspondant. La table jointe conserve chaque enregistrement, même s'il n'existe aucun autre enregistrement correspondant. Les jointures externes se subdivisent davantage en jointures externes gauche et jointures externes droite, selon les lignes de la table qui sont conservées (gauche ou droite).
Jointure externe gauche: - Le résultat d'une jointure externe gauche (ou simplement jointure gauche) pour les tables Employé et Emplacement contient toujours tous les enregistrements de la table "gauche" ( Employé ), même si la condition de jointure ne trouve aucun enregistrement correspondant dans le "bon" tableau ( Emplacement ). Voici à quoi ressemblerait le SQL pour une jointure externe gauche, en utilisant les tableaux ci-dessus:
Maintenant, voici à quoi ressemblerait le résultat de l'exécution de ce SQL:
Jointure externe droite: - Une jointure externe droite (ou jointure droite) ressemble étroitement à une jointure externe gauche, sauf avec le traitement des tableaux inversé. Chaque ligne de la table "droite" ( Emplacement ) apparaîtra dans la table jointe au moins une fois. Si aucune ligne correspondante de la table "gauche" ( Employé ) n'existe, NULL apparaîtra dans les colonnes de Employé pour les enregistrements qui n'ont aucune correspondance dans Emplacement . Voici à quoi ressemble le SQL:
En utilisant les tableaux ci-dessus, nous pouvons montrer à quoi ressemblerait l'ensemble de résultats d'une jointure externe droite:
Jointures extérieures complètes: - externes complètes La jointure externe complète ou la jointure complète consiste à conserver les informations non correspondantes en incluant des lignes non correspondantes dans les résultats d'une jointure, utilisez une jointure externe complète. Il inclut toutes les lignes des deux tables, que l'autre table ait ou non une valeur correspondante.
Source de l'image
Manuel de référence MySQL 8.0 - Join Syntax
Opérations Oracle Join
la source
Jointure interne
Récupérez uniquement les lignes correspondantes, c'est-à-dire
A intersect B
.Jointure externe gauche
Sélectionnez tous les enregistrements de la première table et tous les enregistrements de la deuxième table qui correspondent aux clés jointes.
Jointure externe complète
Sélectionnez tous les enregistrements de la deuxième table et tous les enregistrements de la première table qui correspondent aux clés jointes.
Références
Exemples SQL de jointures internes et externes et le bloc Join
SQL: JOINS
la source
En termes simples:
Une jointure interne récupère uniquement les lignes correspondantes.
Alors qu'une jointure externe récupère les lignes correspondantes d'une table et toutes les lignes d'une autre table .... le résultat dépend de celle que vous utilisez:
Gauche : lignes correspondantes dans le tableau de droite et toutes les lignes du tableau de gauche
Droite : lignes correspondantes dans le tableau de gauche et toutes les lignes du tableau de droite ou
Complet : toutes les lignes de tous les tableaux. Peu importe s'il y a correspondance ou non
la source
Une jointure interne n'affiche des lignes que s'il existe un enregistrement correspondant de l'autre côté (droit) de la jointure.
Une jointure externe (gauche) affiche des lignes pour chaque enregistrement sur le côté gauche, même s'il n'y a pas de lignes correspondantes de l'autre côté (droit) de la jointure. S'il n'y a pas de ligne correspondante, les colonnes de l'autre côté (droit) afficheront des valeurs NULL.
la source
Les jointures internes nécessitent qu'un enregistrement avec un ID associé existe dans la table jointe.
Les jointures externes renverront des enregistrements pour le côté gauche même si rien n'existe pour le côté droit.
Par exemple, vous avez une table Orders et une table OrderDetails. Ils sont liés par un "OrderID".
Ordres
Détails de la commande
La demande
ne renverra que les commandes qui contiennent également quelque chose dans la table OrderDetails.
Si vous le remplacez par EXTERIEUR GAUCHE
il renverra alors les enregistrements de la table Orders même s'ils n'ont aucun enregistrement OrderDetails.
Vous pouvez l'utiliser pour trouver des commandes qui n'ont aucun OrderDetails indiquant une commande orpheline possible en ajoutant une clause where comme
WHERE OrderDetails.OrderID IS NULL
.la source
SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
àSELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
(MySQL) avec succès. Je n'étais pas sûr des conditions supplémentaires, elles se mélangent bien ...En termes simples:
Jointure interne -> Prendre UNIQUEMENT des enregistrements communs des tables parent et enfant OERE la clé primaire de la table parent correspond à la clé étrangère dans la table enfant.
Jointure gauche ->
pseudo code
Jointure droite : Exactement opposée à la jointure gauche. Mettez le nom de la table dans LEFT JOIN à droite dans Right join, vous obtenez la même sortie que LEFT JOIN.
Jointure externe : affiche tous les enregistrements des deux tables
No matter what
. Si les enregistrements de la table de gauche ne correspondent pas à la table de droite en fonction de la clé Forieign principale, utilisez la valeur NULL comme résultat de la jointure.Exemple :
Supposons maintenant pour 2 tables
1.employees , 2.phone_numbers_employees
Ici, la table des employés est la table principale, phone_numbers_employees est la table enfant (elle contient
emp_id
comme clé étrangère qui connecteemployee.id
ainsi sa table enfant.)Jointures internes
Prenez les enregistrements de 2 tables UNIQUEMENT SI la clé primaire de la table des employés (son id) correspond à la clé étrangère de la table enfant phone_numbers_employees (emp_id) .
La requête serait donc:
Ici, prenez uniquement les lignes correspondantes sur la clé primaire = clé étrangère comme expliqué ci-dessus. Ici, les lignes non correspondantes sur la clé primaire = clé étrangère sont ignorées en raison de la jointure.
Jointures gauches :
La jointure gauche conserve toutes les lignes de la table de gauche, qu'il existe ou non une ligne correspondant à la table de droite.
Jointures externes :
Schématiquement, cela ressemble à:
la source
Vous utilisez
INNER JOIN
pour renvoyer toutes les lignes des deux tables où il y a une correspondance. ie dans le tableau résultant, toutes les lignes et colonnes auront des valeurs.Dans
OUTER JOIN
le tableau résultant peut avoir des colonnes vides. La jointure externe peut être soitLEFT
ouRIGHT
.LEFT OUTER JOIN
renvoie toutes les lignes de la première table, même s'il n'y a aucune correspondance dans la deuxième table.RIGHT OUTER JOIN
renvoie toutes les lignes de la deuxième table, même s'il n'y a aucune correspondance dans la première table.la source
Ceci est une bonne explication schématique pour toutes sortes de jointures
source: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
la source
INNER JOIN
nécessite qu'il y ait au moins une correspondance dans la comparaison des deux tableaux. Par exemple, le tableau A et le tableau B qui impliquent A ٨ B (A intersection B).LEFT OUTER JOIN
etLEFT JOIN
sont les mêmes. Il donne tous les enregistrements correspondants dans les deux tableaux et toutes les possibilités du tableau de gauche.De même,
RIGHT OUTER JOIN
etRIGHT JOIN
sont les mêmes. Il donne tous les enregistrements correspondant dans les deux tables et toutes les possibilités de la bonne table.FULL JOIN
est la combinaison deLEFT OUTER JOIN
etRIGHT OUTER JOIN
sans duplication.la source
La réponse est dans le sens de chacun, donc dans les résultats.
Ma réponse est basée sur la note ci-dessus .
Lorsque vous avez deux tables comme celles-ci:
CROSS JOIN / OUTER JOIN:
Vous pouvez avoir toutes ces données de tables avec
CROSS JOIN
ou simplement avec,
comme ceci:INNER JOIN:
Lorsque vous souhaitez ajouter un filtre aux résultats ci-dessus en fonction d'une relation comme
table1.id = table2.id
vous pouvez utiliserINNER JOIN
:LEFT [OUTER] JOIN:
Lorsque vous voulez avoir toutes les lignes d'une des tables dans le résultat ci-dessus - avec la même relation - vous pouvez utiliser
LEFT JOIN
:(Pour RIGHT JOIN il suffit de changer la place des tables)
FULL OUTER JOIN:
Lorsque vous souhaitez également avoir toutes les lignes de l'autre tableau dans vos résultats, vous pouvez utiliser
FULL OUTER JOIN
:Eh bien, selon vos besoins, vous choisissez chacun qui répond à vos besoins;).
la source
full outer join
dans MySQL.Jointure interne.
Une jointure combine les lignes de deux tables. Une jointure interne tente de faire correspondre les deux tables en fonction des critères que vous spécifiez dans la requête et ne renvoie que les lignes qui correspondent. Si une ligne de la première table de la jointure correspond à deux lignes de la deuxième table, deux lignes seront renvoyées dans les résultats. S'il y a une ligne dans la première table qui ne correspond pas à une ligne dans la seconde, elle n'est pas renvoyée; de même, s'il y a une ligne dans la deuxième table qui ne correspond pas à une ligne dans la première, elle n'est pas renvoyée.
Jointure externe.
Une jointure gauche tente de trouver une correspondance entre les lignes de la première table et les lignes de la seconde table. S'il ne trouve pas de correspondance, il renverra les colonnes de la première table et laissera les colonnes de la deuxième table vides (null).
la source
INNER JOIN
jointure la plus typique pour deux tables ou plus. Il renvoie la correspondance des données à la fois sur la relation ON keykey et forignkey.OUTER JOIN
est identique àINNER JOIN
, mais il inclut également desNULL
données sur ResultSet.LEFT JOIN
=INNER JOIN
+ Données inégalées du tableau de gauche avecNull
correspondance sur le tableau de droite.RIGHT JOIN
=INNER JOIN
+ Données inégalées de la table de droite avecNull
correspondance sur la table de gauche.FULL JOIN
=INNER JOIN
+ Données inégalées sur les tableaux de droite et de gauche avec desNull
correspondances.INNER JOIN
etOUTER JOIN
nous pouvons écrire des requêtes d'auto-jointure.Par exemple:
la source
Je ne vois pas beaucoup de détails sur les performances et l'optimiseur dans les autres réponses.
Parfois, il est bon de savoir que
INNER JOIN
est associatif, ce qui signifie que l'optimiseur a le plus d'options pour jouer avec. Il peut réorganiser l'ordre de jointure pour le rendre plus rapide en conservant le même résultat. L'optimiseur peut utiliser le plus de modes de jointure.En règle générale, il est recommandé d'utiliser
INNER JOIN
plutôt que les différents types de jointures. (Bien sûr, si cela est possible compte tenu de l'ensemble de résultats escompté.)Il y a quelques bons exemples et explications ici sur cet étrange comportement associatif:
la source
INNER JOIN
c'est plus lent que laLEFT JOIN
plupart du temps, et les gens peuvent utiliserLEFT JOIN
au lieu d'INNER JOIN
en ajouter unWHERE
pour supprimer lesNULL
résultats inattendus ;).INNER
c'est plus lent?Ayant critiqué le diagramme de Venn aux tons rouges très apprécié, j'ai pensé qu'il était juste de publier ma propre tentative.
Bien que la réponse de @Martin Smith soit la meilleure de cette grappe de loin, la sienne ne montre que la colonne clé de chaque table, alors que je pense que les colonnes non clés devraient également être affichées.
Du mieux que j'ai pu faire dans la demi-heure autorisée, je ne pense toujours pas que cela montre adéquatement que les valeurs nulles sont là en raison de l'absence de valeurs clés dans
TableB
ou quiOUTER JOIN
est en fait une union plutôt qu'une jointure:la source
TableA a LEFT OUTER JOIN TableB b
parTableB B RIGHT OUTER JOIN TableA a
L'algorithme précis pour
INNER JOIN
,LEFT/RIGHT OUTER JOIN
est le suivant:a
(a, b[i])
ON ...
clause par rapport à chaque paire:ON( a, b[i] ) = true/false?
true
, renvoyez cette ligne combinée(a, b[i])
.Outer Join
alors de renvoyer une paire (virtuelle) en utilisantNull
pour toutes les colonnes de l'autre table:(a, Null)
pour la jointure externe GAUCHE ou(Null, b)
pour la jointure externe DROITE. Il s'agit de s'assurer que toutes les lignes de la première table existent dans les résultats finaux.Remarque: la condition spécifiée dans la
ON
clause peut être n'importe quoi, il n'est pas nécessaire d'utiliser des clés primaires (et vous n'avez pas besoin de toujours faire référence aux colonnes des deux tables)! Par exemple:... ON T1.title = T2.title AND T1.version < T2.version
(=> voir cet article comme exemple d'utilisation: sélectionnez uniquement les lignes avec une valeur maximale dans une colonne )... ON T1.y IS NULL
... ON 1 = 0
(juste comme échantillon)Remarque: Jointure gauche = jointure externe gauche, jointure droite = jointure externe droite.
la source
Définitions les plus simples
Inner Join: renvoie les enregistrements correspondants des deux tables.
Jointure externe complète: renvoie les enregistrements correspondants et sans correspondance des deux tables avec null pour les enregistrements sans correspondance des deux tables .
Jointure externe gauche: renvoie les enregistrements correspondants et non correspondants uniquement à partir du tableau du côté gauche .
Jointure externe droite: renvoie uniquement les enregistrements correspondants et inégalés à partir de la table du côté droit .
En bref
Correspondance + gauche sans correspondance + droite sans correspondance = jointure externe complète
Correspondance + gauche inégalée = jointure externe gauche
Matched + Right Unmatched = Jointure externe droite
Correspondance = jointure interne
la source
En termes simples,
1. INNER JOIN OU EQUI JOIN: renvoie l'ensemble de résultats qui ne correspond qu'à la condition dans les deux tableaux.
2. OUTER JOIN: renvoie le jeu de résultats de toutes les valeurs des deux tables même s'il existe une correspondance de condition ou non.
3. JOINT GAUCHE: renvoie l'ensemble de résultats de toutes les valeurs du tableau de gauche et uniquement les lignes qui correspondent à la condition du tableau de droite.
4. JOINDRE À DROITE: renvoie l'ensemble de résultats de toutes les valeurs de la table de droite et uniquement les lignes qui correspondent à la condition dans la table de gauche.
5. FULL JOIN: la jointure complète et la jointure externe complète sont identiques.
la source
Il existe principalement 2 types de JOIN en SQL: [INNER et OUTER]
Exemples
Supposons que vous ayez deux tables, avec une seule colonne chacune, et les données comme suit:
Notez que (1,2,7,8) sont uniques à A, (3,4) sont communs et (5,6) sont uniques à B.
Le mot clé INNER JOIN sélectionne toutes les lignes des deux tables tant que la condition est remplie. Ce mot-clé créera l'ensemble de résultats en combinant toutes les lignes des deux tables où la condition satisfait, c'est-à-dire que la valeur du champ commun sera la même.
Résultat:
Cette jointure renvoie toutes les lignes de la table sur le côté gauche de la jointure et les lignes correspondantes pour la table sur le côté droit de la jointure. Les lignes pour lesquelles il n'y a pas de ligne correspondante sur le côté droit, le jeu de résultats contiendra null. LEFT JOIN est aussi connu sous le nom de
LEFT OUTER JOIN
.Résultat:
Résultat:
JOINTURE COMPLÈTE (EXTÉRIEURE) :
FULL JOIN crée l'ensemble de résultats en combinant le résultat de LEFT JOIN et de RIGHT JOIN. L'ensemble de résultats contiendra toutes les lignes des deux tables. Les lignes pour lesquelles il n'y a pas de correspondance, l'ensemble de résultats contiendra des valeurs NULL.
Résultat:
la source
Jointure interne - Une jointure interne utilisant l'une des requêtes équivalentes donne l'intersection des deux tables , c'est-à-dire les deux lignes qu'elles ont en commun.
Jointure externe gauche - Une jointure externe gauche donnera toutes les lignes dans A, plus toutes les lignes communes dans B.
Jointure externe complète - Une jointure externe complète vous donnera l'union de A et B, c'est-à-dire toutes les lignes dans A et toutes les lignes dans B. Si quelque chose dans A n'a pas de donnée correspondante dans B, alors la partie B est null et vice versa
la source
Join is not an intersection unless the tables have the same columns
Non. Vous pouvez joindre toutes les colonnes de votre choix et si la valeur correspond, elles se rejoindront.1. Jointure interne: également appelée jointure. Il renvoie les lignes présentes dans le tableau de gauche et le tableau de droite uniquement s'il existe une correspondance . Sinon, il ne renvoie aucun enregistrement.
Exemple:
2. Jointure externe complète: également appelée jointure complète. Il renvoie toutes les lignes présentes à la fois dans le tableau de gauche et dans le tableau de droite.
Exemple:
3. Jointure gauche externe: ou simplement appelée jointure gauche. Il renvoie toutes les lignes présentes dans le tableau de gauche et les lignes correspondantes du tableau de droite (le cas échéant).
4. Jointure externe droite: également appelée jointure droite. Il renvoie les lignes correspondantes de la table de gauche (le cas échéant) et toutes les lignes présentes dans la table de droite.
Avantages des jointures
la source
Considérez ci-dessous 2 tableaux:
EMP
département
Jointure interne:
Généralement écrit comme simplement JOIN dans des requêtes SQL. Il renvoie uniquement les enregistrements correspondants entre les tables.
Découvrez tous les employés et les noms de leurs départements:
Comme vous le voyez ci-dessus,
Jose
n'est pas imprimé à partir d' EMP dans la sortie car son dept_id6
ne trouve pas de correspondance dans la table Department. De même,HR
et lesR&D
lignes ne sont pas imprimées du département table comme ils ne trouvaient pas un match dans le tableau Emp.Ainsi, INNER JOIN ou simplement JOIN, renvoie uniquement les lignes correspondantes.
JOINT GAUCHE :
Cela renvoie tous les enregistrements de la table LEFT et uniquement les enregistrements correspondants de la table RIGHT.
Ainsi, si vous observez la sortie ci-dessus, tous les enregistrements de la table LEFT (Emp) sont imprimés avec uniquement les enregistrements correspondants de la table RIGHT.
HR
et lesR&D
lignes ne sont pas imprimées à partir de la table Department car elles n'ont pas trouvé de correspondance dans la table Emp sur dept_id.Ainsi, LEFT JOIN renvoie TOUTES les lignes de la table Left et uniquement les lignes correspondantes de la table RIGHT.
Vous pouvez également consulter DEMO ici .
la source
L'idée générale
Veuillez consulter la réponse de Martin Smith pour de meilleures illustrations et explications des différentes jointures, y compris et surtout les différences entre
FULL OUTER JOIN
,RIGHT OUTER JOIN
etLEFT OUTER JOIN
.Ces deux tableaux constituent une base pour la représentation des
JOIN
s ci-dessous:CROSS JOIN
Le résultat sera les produits cartésiens de toutes les combinaisons. Aucune
JOIN
condition requise:JOINTURE INTERNE
INNER JOIN
est la même chose que simplement:JOIN
Le résultat sera des combinaisons qui satisfont à la
JOIN
condition requise :JOINTURE EXTERNE GAUCHE
LEFT OUTER JOIN
est le même queLEFT JOIN
Le résultat sera tout,
citizen
même s'il n'y a pas de correspondancepostalcode
. Encore une fois, uneJOIN
condition est requise:Données pour jouer
Tous les exemples ont été exécutés sur un Oracle 18c. Ils sont disponibles sur dbfiddle.uk, d' où proviennent également les captures d'écran des tableaux.
Limites floues lors de la lecture avec
JOIN
etWHERE
CROSS JOIN
CROSS JOIN
résultant en lignes comme l'idée générale /INNER JOIN
:L'utilisation
CROSS JOIN
pour obtenir le résultat d'unLEFT OUTER JOIN
requiert des astuces comme l'ajoutNULL
consécutif. C'est omis.JOINTURE INTERNE
INNER JOIN
devient un produit cartésien. C'est la même chose que The General Idea /CROSS JOIN
:C'est là que la jointure interne peut vraiment être vue comme la jointure croisée avec des résultats ne correspondant pas à la condition supprimée. Ici, aucune des lignes résultantes n'est supprimée.
Utiliser
INNER JOIN
pour obtenir le résultat d'unLEFT OUTER JOIN
nécessite également des astuces. C'est omis.JOINTURE EXTERNE GAUCHE
LEFT JOIN
résulte en lignes comme l'idée générale /CROSS JOIN
:LEFT JOIN
résulte en lignes comme l'idée générale /INNER JOIN
:Les problèmes avec le diagramme de Venn
Une recherche d'image sur Internet sur "sql join cross inner inner" montrera une multitude de diagrammes de Venn. J'en avais une copie imprimée sur mon bureau. Mais il y a des problèmes avec la représentation.
Le diagramme de Venn est excellent pour la théorie des ensembles, où un élément peut être dans l'un ou les deux ensembles. Mais pour les bases de données, un élément dans un "ensemble" me semble être une ligne dans une table, et donc pas également présent dans d'autres tables. Il n'y a rien de tel qu'une ligne présente dans plusieurs tables. Une ligne est unique à la table.
Les auto-jointures sont un cas d'angle où chaque élément est en fait le même dans les deux ensembles. Mais ce n'est toujours pas exempt des problèmes ci-dessous.
L'ensemble
A
représente l'ensemble à gauche (lecitizen
tableau) et l'ensembleB
est l'ensemble à droite (lepostalcode
tableau) dans la discussion ci-dessous.CROSS JOIN
Chaque élément des deux ensembles correspond à chaque élément de l'autre ensemble, ce qui signifie que nous avons besoin de la
A
quantité de tous lesB
éléments et de laB
quantité de tous lesA
éléments pour représenter correctement ce produit cartésien. La théorie des ensembles n'est pas faite pour plusieurs éléments identiques dans un ensemble, donc je trouve que les diagrammes de Venn pour le représenter correctement sont peu pratiques / impossibles. Il ne semble pas queUNION
convenir.Les rangées sont distinctes. Il
UNION
s'agit d'un total de 7 lignes. Mais ils sont incompatibles pour unSQL
ensemble de résultats commun . Et ce n'est pas du tout ainsi queCROSS JOIN
fonctionne:Essayer de le représenter comme ceci:
..mais maintenant ça ressemble à un
INTERSECTION
, ce qui n'est certainement pas le cas . De plus, il n'y a aucun élément dansINTERSECTION
qui se trouve réellement dans l'un des deux ensembles distincts. Cependant, cela ressemble beaucoup aux résultats consultables similaires à ceci:Pour référence, un résultat de recherche pour
CROSS JOIN
s peut être vu sur Tutorialgateway . LeINTERSECTION
, tout comme celui-ci, est vide.JOINTURE INTERNE
La valeur d'un élément dépend de la
JOIN
condition. Il est possible de représenter cela sous la condition que chaque ligne devienne unique à cette condition. La significationid=x
n'est vraie que pour une ligne. Une fois qu'une ligne de tableA
(citizen
) correspond à plusieurs lignes de tableB
(postalcode
) sous laJOIN
condition, le résultat présente les mêmes problèmes queCROSS JOIN
: La ligne doit être représentée plusieurs fois, et la théorie des ensembles n'est pas vraiment faite pour cela. Sous la condition d'unicité, le diagramme peut cependant fonctionner, mais gardez à l'esprit que laJOIN
condition détermine le placement d'un élément dans le diagramme. En regardant uniquement les valeurs de laJOIN
condition avec le reste de la ligne juste pour la balade:Cette représentation s'effondre complètement lors de l'utilisation d'un
INNER JOIN
avec uneON 1 = 1
condition qui en fait unCROSS JOIN
.Avec un self-
JOIN
, les lignes sont en fait des éléments identitaires dans les deux tables, mais représentant les tables comme les deuxA
etB
n'est pas très approprié. Par exemple , un auto communJOIN
condition qui rend un élémentA
à faire correspondre un autre élément B estON A.parent = B.child
, ce qui rend la correspondance d'A
àB
des éléments séparés. D'après les exemples quiSQL
ressembleraient à ceci:Ce qui signifie que Smith est le leader de Green et de Jensen.
JOINT EXTERIEUR
Encore une fois, les problèmes commencent lorsqu'une ligne a plusieurs correspondances avec les lignes de l'autre table. Ceci est encore plus compliqué parce que le
OUTER JOIN
peut correspondre à l'ensemble vide. Mais dans la théorie des ensembles, l'union d'un ensembleC
et d'un ensemble vide est toujours justeC
. L'ensemble vide n'ajoute rien. La représentation de ceciLEFT OUTER JOIN
montre généralement toutA
pour illustrer que les lignesA
sont sélectionnées indépendamment de la présence ou non d'une correspondanceB
. Les "éléments correspondants" ont cependant les mêmes problèmes que l'illustration ci-dessus. Ils dépendent de la condition. Et l'ensemble vide semble avoir erré versA
:Clause WHERE - sens
Trouver toutes les lignes d'un
CROSS JOIN
avec Smith et le code postal sur la Lune:Maintenant, le diagramme de Venn n'est pas utilisé pour refléter le
JOIN
. Il est utilisé uniquement pour laWHERE
clause:..et cela a du sens.
Quand INTERSECT et UNION ont du sens
COUPER
Comme expliqué, ce
INNER JOIN
n'est pas vraiment unINTERSECT
. Cependant,INTERSECT
s peut être utilisé sur les résultats de requêtes distinctes. Ici, un diagramme de Venn est logique, car les éléments des requêtes distinctes sont en fait des lignes qui appartiennent à l'un des résultats ou aux deux. Intersect ne retournera évidemment que les résultats là où la ligne est présente dans les deux requêtes. CelaSQL
se traduira par la même ligne que celle ci-dessusWHERE
, et le diagramme de Venn sera également le même:SYNDICAT
Un
OUTER JOIN
n'est pas unUNION
. Cependant,UNION
travaillez dans les mêmes conditions queINTERSECT
, ce qui entraîne un retour de tous les résultats combinant les deuxSELECT
s:ce qui équivaut à:
..et donne le résultat:
Ici aussi, un diagramme de Venn est logique:
Quand cela ne s'applique pas
Une note importante est que ceux-ci ne fonctionnent que lorsque la structure des résultats des deux SELECT est la même, permettant une comparaison ou une union. Les résultats de ces deux ne permettront pas que:
..essayer de combiner les résultats avec
UNION
donne unPour plus d'intérêt, lisez Dire NON aux diagrammes Venn lors de l'explication des jointures et des jointures sql en tant que diagramme venn . Les deux couvrent également
EXCEPT
.la source
Il y a beaucoup de bonnes réponses ici avec des exemples d' algèbre relationnelle très précis . Voici une réponse très simplifiée qui pourrait être utile pour les codeurs amateurs ou novices avec des dilemmes de codage SQL.
Fondamentalement, le plus souvent, les requêtes
JOIN
se résument à deux cas:Pour un
SELECT
sous - ensemble de donnéesA
:INNER JOIN
lorsque les données connexes queB
vous recherchez DOIVENT exister par conception de base de données;LEFT JOIN
lorsque les données connexes queB
vous recherchez MIGHT ou RISQUENT DE NE PAS existe par la conception de base de données.la source
La différence entre
inner join
etouter join
est la suivante:Inner join
est une jointure qui combine des tables basées sur des tuples correspondants, alors queouter join
est une jointure qui combine une table basée sur des tuples correspondants et inégalés.Inner join
fusionne les lignes correspondantes de deux tables dans lesquelles les lignes sans correspondance sont omises, tandis que lesouter join
lignes de fusion de deux tables et les lignes sans correspondance sont remplies avec une valeur nulle.Inner join
est comme une opération d'intersection, alors queouter join
c'est comme une opération d'union.Inner join
est deux types, alors qu'ilouter join
y en a trois types.outer join
est plus rapide queinner join
.la source