Quelle est la différence entre “INNER JOIN” et “OUTER JOIN”?
-
09-06-2019 - |
Question
Aussi comment faire LEFT JOIN
, RIGHT JOIN
et FULL JOIN
fit-il?
La solution
En supposant que vous êtes le rejoindre sur colonnes avec pas de doublons, ce qui est un cas très commun:
Une jointure interne de A et B donne le résultat d'Une intersection B, c'est à direla partie intérieure d'un Diagramme de Venn intersection.
Une jointure externe de A et B donne les résultats d'Une union B, c'est à direles parties extérieures d'un diagramme de Venn de l'union.
Exemples
Supposons que vous avez deux tables, avec une seule colonne de chaque, et les données comme suit:
A B
- -
1 3
2 4
3 5
4 6
Notez que (1,2) sont uniques à Une, (3,4) sont communes, et (5,6) sont uniques à B.
Inner join
Une jointure interne en utilisant soit de l'équivalent des requêtes donne à l'intersection de deux tableaux, c'est à direles deux lignes qu'ils ont en commun.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Jointure externe gauche
Une jointure externe gauche donnera toutes les lignes dans Un, plus les communes de lignes de B.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
Jointure externe droite
Une jointure externe droite donnera toutes les lignes de B, majoré de la commune de lignes en A.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
Jointure externe complète
Une jointure externe complète vous donnera l'union de A et de B, c'est à diretoutes les lignes de A et de toutes les lignes dans B.Si quelque chose ne dispose pas d'un correspondant donnée dans le B, le B partie est nulle, et vice versa.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
Autres conseils
Les diagrammes de Venn n'avez pas vraiment le faire pour moi.
Ils ne montrent pas la distinction entre, d'une jointure croisée et une jointure interne, par exemple, ou plus généralement de montrer toute distinction entre les différents types de prédicat de jointure ou de fournir un cadre pour le raisonnement à propos de la façon dont ils fonctionnent.
Il n'y a pas de substitut pour la compréhension de la logique de traitement et il est relativement simple à saisir de toute façon.
- Imaginez une jointure croisée.
- Évaluer l'
on
la clause à l'encontre de toutes les lignes à partir de l'étape 1 en conservant celles où le prédicat est évaluée àtrue
- (Pour les jointures externes uniquement) ajouter dans tous les rangées extérieures qui ont été perdus dans l'étape 2.
(NB:Dans la pratique, l'optimiseur de requête peut trouver des manières plus efficaces de l'exécution de la requête que purement logique de la description ci-dessus, mais le résultat final doit être le même)
Je vais commencer avec une version animée d'un jointure externe complète.Autre explication de la façon suivante.
Explication
Source Tables
Commencez avec un CROSS JOIN
(AKA Produit Cartésien).Ce n'est pas un ON
clause et renvoie simplement chaque combinaison de lignes des deux tables.
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE CROISÉE B
Intérieur et Extérieur se joint à avoir une "SUR la" clause de prédicat.
- Jointure Interne. L'évaluation de l'état dans le "ON" clause de toutes les lignes dans la jointure croisée résultat.Si le rendement réel de l'rejoint la ligne.Sinon l'éliminer.
- Une Jointure Externe Gauche. Même que inner join puis pour toutes les lignes dans la table de gauche qui ne correspondent à rien de sortie de ces avec des valeurs NULL pour le droit des colonnes de la table.
- Jointure Externe Droite. Même que inner join puis pour toutes les lignes dans la table de droite qui ne correspondent à rien de sortie de ces avec des valeurs NULL pour la gauche des colonnes de la table.
- Jointure Externe Complète. Même comme jointure interne puis de préserver la gauche non appariés lignes comme dans la jointure externe gauche et à droite de la non correspondance des lignes comme par jointure externe droite.
Quelques exemples
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE INTERNE de B SUR A. Couleur = B. la Couleur
Le ci-dessus est le classique équi-jointure.
Version Animée
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE INTERNE de B SUR A. Couleur PAS DANS ('Vert','Bleu')
L'intérieure de la condition de jointure n'est pas forcément un état d'égalité et il n'a pas besoin de faire référence à des colonnes à partir de deux (ou même plus) des tables.L'évaluation de A.Colour NOT IN ('Green','Blue')
sur chaque ligne de la jointure croisée des rendements.
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE INTERNE B 1 =1
La condition de jointure est évaluée à true pour toutes les lignes de la jointure croisée résultat si ce n'est que le même comme une jointure croisée.Je ne vais pas répéter l'image du 16 rangées de nouveau.
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE EXTERNE GAUCHE de B SUR A. Couleur = B. la Couleur
Les Jointures externes sont logiquement évalué de la même façon que les jointures internes, sauf que si une ligne de la table de gauche (pour un left join) ne pas joindre à l'une des lignes de la main droite de la table, c'est conservée dans le résultat avec NULL
les valeurs de la droite des colonnes.
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE EXTERNE GAUCHE de B SUR A. Couleur = B. la Couleur là OÙ B. la Couleur EST NULL
Cela restreint le résultat précédent pour retourner uniquement les lignes où B.Colour IS NULL
.Dans ce cas particulier, ce seront les lignes qui ont été conservés car ils n'avaient pas de correspondance dans la main droite de la table et que la requête retourne le rouge unique ligne pas de correspondance dans la table B
.Ceci est connu comme un anti semi-jointure.
Il est important de sélectionner une colonne pour le IS NULL
test qui n'est pas nullable, ou pour lequel la condition de jointure assure que tout NULL
les valeurs seront exclus pour que ce modèle fonctionne correctement et ne pas se contenter de ramener les lignes qui arrive d'avoir un NULL
valeur pour cette colonne en plus de l'onu lignes correspondantes.
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE EXTERNE DROITE de B SUR A. Couleur = B. la Couleur
Droit des jointures externes agir de même à gauche, les jointures externes à l'exception de préserver la non correspondance des lignes de la table de droite et null étendre les colonnes de gauche.
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE EXTERNE COMPLÈTE de B SUR A. Couleur = B. la Couleur
Les jointures externes complètes combiner le comportement de droite et de gauche rejoint et préserver la non correspondance des lignes de la gauche et de la droite les tables.
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE EXTERNE COMPLÈTE B 1 = 0
Pas de lignes dans la jointure croisée correspondre à la 1=0
prédicat.Toutes les lignes des deux côtés sont conservés en utilisant une jointure externe règles avec la valeur NULL dans les colonnes de la table de l'autre côté.
SÉLECTIONNEZ FUSIONNER(A. Couleur, B. Couleur) Couleur à PARTIR d'UNE JOINTURE EXTERNE COMPLÈTE B 1 = 0
Avec une mineure de modifier à la précédente requête, il est possible de simuler un UNION ALL
des deux tables.
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE EXTERNE GAUCHE de B SUR A. Couleur = B. la Couleur là OÙ B. Couleur = "Vert"
Notez que l' WHERE
clause (si présent) logiquement s'exécute après la jointure.Une erreur courante consiste à effectuer une jointure externe gauche et puis d'inclure une clause where avec une condition sur la table de droite qui se termine à l'exclusion de la non correspondance des lignes.Le ci-dessus se termine effectuer la jointure externe...
...Et puis, la clause "where" s'exécute. NULL= 'Green'
n'évalue pas vrai, alors la ligne préservés par la jointure externe finit rejeté (avec la bleue) de la conversion de la jointure de retour à l'intérieure.
Si l'intention était d'inclure uniquement les lignes de B si la Couleur est Verte et toutes les lignes à partir d'Un indépendamment de la syntaxe correcte serait
SÉLECTIONNEZ A. Couleur, B. de Couleur à PARTIR d'UNE JOINTURE EXTERNE GAUCHE de B SUR A. Couleur = B. la Couleur ET de la B. Couleur = "Vert"
SQL Violon
Voir les exemples exécuter en direct à SQLFiddle.com.
Les jointures sont utilisées pour combiner les données de deux tables, avec pour résultat une nouvelle table temporaire.Les jointures sont effectuée sur la base de quelque chose qui s'appelle un prédicat, qui spécifie la condition de l'utiliser pour effectuer une jointure.La différence entre une jointure interne et externe de jointure est une jointure interne sera de retour uniquement les lignes qui correspondent réellement basée sur le prédicat de jointure.Laisse envisager des Employés et de l'Emplacement de la table:
Jointure Interne:- Jointure interne crée un nouveau tableau de résultat en combinant les valeurs des colonnes de deux tables (Employé et Emplacement) sur la base du join-prédicat.La requête compare chaque ligne de Employé à chaque ligne de l' Emplacement pour trouver toutes les paires de lignes qui satisfont la jointure-prédicat.Lorsque la jointure-prédicat est satisfait par la correspondance de valeurs non NULLES, valeurs de colonne pour chaque paire de lignes de Employé et Emplacement sont combinés en une ligne de résultat.Voici ce que le SQL pour une jointure interne va ressembler:
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
Maintenant, voici ce que le résultat de l'exécution de SQL ressemblerait à:
Jointure Externe:- Une jointure externe ne nécessite pas de chaque enregistrement dans les deux tables jointes à avoir un enregistrement correspondant.La table jointe conserve chaque dossier—même si aucun autre enregistrement correspondant existe.Les jointures externes subdiviser davantage dans des jointures externes gauches et droit des jointures externes, en fonction de la lignes du tableau sont conservés (gauche ou droite).
Jointure Externe Gauche:- Le résultat d'une jointure externe gauche (ou simplement left join) pour les tableaux Employé et Emplacement toujours contient tous les enregistrements de la "gauche" (tableEmployé), même si la jointure condition ne trouve aucun enregistrement correspondant dans le "droit" de la table (Emplacement).Voici ce que le SQL pour une jointure externe gauche devrait ressembler, en utilisant les tableaux ci-dessus:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
Maintenant, voici ce que le résultat de l'exécution de la présente SQL ressemblerait à:
Jointure Externe Droite:- Une jointure externe droite (ou right join) ressemble à une jointure externe gauche, à l'exception du traitement de la tables renversées.Chaque ligne de la "droite" (tableEmplacement) apparaîtra dans la table jointe au moins une fois.Si aucune ligne correspondante de la "gauche" (tableEmployé il existe, NULL, apparaissent dans les colonnes de Employé pour les enregistrements qui n'ont pas de correspondance dans Emplacement.C'est ce que le SQL ressemble à:
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
À l'aide des tableaux ci-dessus, nous pouvons montrer que le résultat d'une jointure externe droite ressemblerait à:
Plein Les Jointures Externes:- Jointure Externe complète ou Complète de Jointure est de conserver les informations non correspondantes en incluant les lignes sans correspondance dans les résultats d'une jointure, utilisez une jointure externe complète.Il inclut toutes les lignes des deux tables, indépendamment de si oui ou non l'autre table a une valeur correspondante.
Inner Join
Récupérer les lignes correspondantes seulement, c'est, A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Jointure Externe Gauche
Sélectionner tous les enregistrements de la première table, et tous les enregistrements dans la deuxième le tableau qui correspond à la rejoint clés.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Jointure Externe Complète
Sélectionner tous les enregistrements de la deuxième table, et tous les enregistrements dans la première le tableau qui correspond à la rejoint clés.
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Références
En termes simples:
Un inner join récupérer les lignes correspondantes seulement.
Alors qu'un jointure externe récupérer les paires de lignes d'une table et toutes les lignes d'une autre table ....le résultat dépend de ce que vous utilisez:
De gauche:Lignes correspondantes dans la table de droite et de toutes les lignes dans la table de gauche
Droit:Lignes correspondantes dans la table de gauche et de toutes les lignes dans la table de droite ou de
Plein:Toutes les lignes de toutes les tables.Il n'a pas d'importance si il y a un match ou pas
Une jointure interne affiche uniquement les lignes si un enregistrement correspondant à l'autre (à droite) de la jointure.
A (à gauche) de la jointure externe montre lignes pour chaque enregistrement sur le côté gauche, même si il n'y a pas de lignes correspondantes sur l'autre (à droite) de la jointure.Si il n'y a pas de ligne correspondante, les colonnes de l'autre (à droite) serait de montrer les valeurs Null.
Les jointures internes nécessitent qu'un enregistrement avec une relative ID existent dans la table jointe.
Les jointures externes seront de retour des dossiers pour le côté gauche, même si rien n'existe pour le côté droit.
Par exemple, vous avez un Ordres et une table OrderDetails.Ils sont liés par un "OrderID".
Les commandes
- N ° de commande
- CustomerName
OrderDetails
- OrderDetailID
- N ° de commande
- ProductName
- Qté
- Prix
La demande
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
vous obtiendrez uniquement les Commandes qui ont aussi quelque chose dans la table OrderDetails.
Si vous la modifiez à l'EXTÉRIEUR LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
ensuite, il renvoie les enregistrements de la table Commandes, même si elles n'ont pas de OrderDetails enregistrements.
Vous pouvez l'utiliser pour trouver les Commandes qui n'ont pas d'OrderDetails indiquant un possible orphelins de la commande par l'ajout d'une clause where comme WHERE OrderDetails.OrderID IS NULL
.
En termes simples :
Inner join -> Prendre SEULEMENT les enregistrements de tables parent et enfant OÙ la clé primaire de la table Parent correspond à clé Étrangère dans la table Enfant.
Left join ->
le pseudo-code
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
Jointure droite :Exactement à l'opposé de jointure gauche .Mettre le nom de la table de JOINTURE GAUCHE à droite dans la jointure Droite , vous obtenez la même sortie que LEFT JOIN.
Jointure externe :Afficher tous les enregistrements des Deux tables No matter what
.Si les enregistrements dans la table de Gauche ne correspond pas à droite de la table Primaire , Forieign , utiliser la valeur NULL comme résultat de la jointure .
Exemple :
Supposons maintenant pour les 2 tables
1.employees , 2.phone_numbers_employees
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
Ici , les employés de la table est la table de Maître , phone_numbers_employees est l'enfant de la table(il contient emp_id
en tant que clé étrangère qui se connecte employee.id
de sorte que son enfant table.)
Les jointures internes
Prendre les registres de 2 tables SEULEMENT SI la clé Primaire de la table employés(son id) correspond à la clé Étrangère de la table Enfant phone_numbers_employees(emp_id).
Donc, la requête serait :
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Ici, seules les lignes correspondant à la clé primaire = clé étrangère comme expliqué ci-dessus.Ici non de lignes correspondantes sur primary key = clé étrangère sont ignorés en tant que résultat de la jointure.
Left join :
Left join conserve toutes les lignes de la table de gauche, peu importe si il ya une ligne qui correspond à la table de droite.
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Les jointures externes :
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Diagramatically il ressemble :
Vous utilisez INNER JOIN
pour renvoyer toutes les lignes des deux tables où il y a un match.c'est à direDans la table résultante de toutes les lignes et les colonnes ont des valeurs.
Dans OUTER JOIN
la table résultante peut avoir des colonnes vides.Jointure externe peut être soit LEFT
ou RIGHT
.
LEFT OUTER JOIN
retourne toutes les lignes de la première table, même si il n'y a pas de correspondance dans la seconde table.
RIGHT OUTER JOIN
retourne toutes les lignes à partir de la deuxième table, même si il n'y a pas de correspondance dans la première table.
C'est une bonne explication schématique pour tous les types de jointures
source: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
INNER JOIN
nécessite au moins un match en comparant les deux tableaux.Par exemple, le tableau A et B, ce qui implique Une ٨ B (Une intersection B).
LEFT OUTER JOIN
et LEFT JOIN
sont les mêmes.Il donne tous les enregistrements correspondants dans les deux tables et toutes les possibilités de la table de gauche.
De même, RIGHT OUTER JOIN
et RIGHT JOIN
sont les mêmes.Il donne tous les enregistrements correspondants dans les deux tables et toutes les possibilités de la table de droite.
FULL JOIN
c'est la combinaison de LEFT OUTER JOIN
et RIGHT OUTER JOIN
sans duplication.
La réponse est dans le sens de chacun, de sorte que dans les résultats.
Note :
DansSQLite
il n'y a pas deRIGHT OUTER JOIN
ouFULL OUTER JOIN
.
Et aussi dansMySQL
il n'y a pas deFULL OUTER JOIN
.
Ma réponse est basée sur ci-dessus Note.
Lorsque vous avez deux tables comme celles-ci:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
CROSS JOIN / JOINTURE EXTERNE :
Vous pouvez avoir l'ensemble de ces tables de données avec CROSS JOIN
ou tout simplement avec ,
comme ceci:
SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
1 | a1 | 3 | b2
2 | b1 | 1 | a2
2 | b1 | 3 | b2
INNER JOIN :
Lorsque vous souhaitez ajouter un filtre au-dessus des résultats basés sur une relation comme table1.id = table2.id
vous pouvez utiliser INNER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
LEFT [OUTER] JOIN :
Lorsque vous voulez avoir toutes les lignes de l'une des tables dans le résultat ci-dessus -avec la même relation que vous pouvez utiliser LEFT JOIN
:
(Pour JOINTURE DROITE il suffit de changer la place de tables)
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
JOINTURE EXTERNE COMPLÈTE :
Lorsque vous aussi vous voulez avoir toutes les lignes de l'autre table dans vos résultats, vous pouvez utiliser FULL OUTER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
--[Results:]
id | name | id | name
-----+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
Null | Null | 3 | b2
Eh bien, en tant que votre besoin de vous choisir à chaque celui qui couvre votre besoin ;).
Jointure interne.
Une jointure est de combiner les lignes des deux tables.Un inner join les tentatives de faire correspondre les deux tables en fonction des critères que vous spécifiez dans la requête et renvoie uniquement les lignes qui correspondent.Si une ligne de la première table dans la jointure correspond à deux lignes de la seconde table, puis deux lignes seront retournés dans les résultats.Si il ya une ligne de la première table qui ne correspond pas à une ligne dans la seconde, il n'est pas remis;de même, si il y a une ligne dans le deuxième tableau, qui ne correspond pas à une ligne dans le premier, il n'est pas retourné.
Jointure Externe.
Un left join les tentatives pour trouver correspondre les lignes de la première table de lignes de la seconde table.Si il ne peut pas trouver une correspondance, il sera de retour les colonnes de la première table et de laisser les colonnes de la deuxième table vide (null).
Je ne vois pas beaucoup de détails sur les performances et d'optimisation dans les autres réponses.
Parfois, il est bon de savoir que c' INNER JOIN
est associatif ce qui signifie que l'optimiseur a le plus de possibilité de jouer avec elle.Il peut réorganiser les rejoindre afin de le rendre plus rapide en gardant le même résultat.L'optimiseur peut utiliser la plupart des modes de rejoindre.
Il est généralement une bonne pratique d'essayer d'utiliser INNER JOIN
au lieu de les différents types de jointures.(Bien sûr, si c'est possible, compte tenu du résultat attendu de l'ensemble.)
Il ya un couple de bons exemples et explication ici sur cet étrange comportement associatif:
L'algorithme précis pour INNER JOIN
, LEFT/RIGHT OUTER JOIN
sont comme suit:
- Prendre chaque ligne de la première table:
a
- Envisager toutes les lignes à partir de la deuxième table à côté d'elle:
(a, b[i])
- Évaluer l'
ON ...
la clause à l'encontre de chaque paire:ON( a, b[i] ) = true/false?
- Lorsque la condition est évaluée à
true
, retour qui, combinée ligne(a, b[i])
. - Quand à la fin de la deuxième table sans match, et c'est un
Outer Join
puis, de retour d'un (virtuel) couplage à l'aide deNull
pour toutes les colonnes de la table:(a, Null)
pour la jointure externe GAUCHE ou(Null, b)
pour la jointure externe DROITE.Ceci est pour s'assurer que toutes les lignes de la première table existe dans les résultats finaux.
- Lorsque la condition est évaluée à
Note: la condition spécifiée dans ON
la clause pourrait être n'importe quoi, il n'est pas nécessaire d'utiliser Les Clés Primaires (et vous n'avez pas besoin de toujours se référer à des Colonnes de deux tables)!Par exemple:
... ON T1.title = T2.title AND T1.version < T2.version
( => voir ce post comme un exemple d'utilisation: Sélectionnez uniquement les lignes avec la valeur de max sur une colonne)... ON T1.y IS NULL
... ON 1 = 0
(comme exemple)
Note: Left Join = Left Outer Join, Right Join = Jointure Externe Droite.
Après avoir critiqué le bien-aimé-rouge-ombragée diagramme de Venn, j'ai pensé qu'il ne juste de poster ma propre tentative.
Bien que @Martin Smith réponse est le meilleur de ce groupe par un long chemin, sa ne montre que la clé de la colonne de chaque table, alors que je pense idéalement non-colonnes de clé doit également être indiqué.
Le mieux que je puisse faire dans la demi-heure de permis, je ne pense toujours pas que c'adéquatement montre que les valeurs null sont là en raison de l'absence de valeurs de clé TableB
ou que OUTER JOIN
est en fait une union plutôt que d'une jointure:
INNER JOIN
plus typiques de la jointure de deux tables ou plus.Il renvoie les données de la table SUR primarykey et forignkey relation.OUTER JOIN
est la même queINNER JOIN
, mais il a également inclusNULL
les données sur le jeu de résultats.LEFT JOIN
=INNER JOIN
+ Inégalée de données de de gauche table avecNull
match sur la table de droite.RIGHT JOIN
=INNER JOIN
+ Inégalée de données de droit table avecNull
match sur la table de gauche.FULL JOIN
=INNER JOIN
+ Inégalée de données sur à la fois à droite et à gauche des tables avec desNull
les matchs.
- Auto jointure n'est pas un mot clé SQL, lorsqu'une table de références données en elle-même ne sait que l'auto-jointure.À l'aide de
INNER JOIN
etOUTER JOIN
on peut écrire soi requêtes de jointure.
Par exemple:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
La Plus Simple Des Définitions
Inner Join:Retourne enregistrements correspondants à partir des deux tables.
Jointure Externe Complète:Retourne correspondance et de les enregistrements sans correspondance à partir de deux tableaux avec des valeurs null pour les enregistrements sans correspondance à partir de Les Deux Tables.
Jointure Externe Gauche:Retourne appariés et les enregistrements sans correspondance uniquement à partir de la table sur Côté Gauche.
Jointure Externe Droite:Retourne appariés et les enregistrements sans correspondance uniquement à partir de la table sur Côté Droit.
Au-Court
Appariés + Gauche Inégalée + Droit Inégalée = Jointure Externe Complète
Appariés + Gauche Inégalée = Jointure Externe Gauche
Appariés + Droit Inégalée = Jointure Externe Droite
Appariés = Inner Join
En Termes Simples,
1.JOINTURE INTERNE OU EQUI REJOINDRE : Retourne le jeu de résultats qui ne correspond qu'à la condition, dans les deux tables.
2.JOINTURE EXTERNE : Retourne le jeu de résultats de toutes les valeurs des deux tableaux, même s'il est en condition de match ou pas.
3.LEFT JOIN : Retourne le jeu de résultats de toutes les valeurs de la table de gauche et seules les lignes qui correspondent à l'état de la table de droite.
4.DROIT DE NOUS REJOINDRE : Retourne le jeu de résultats de toutes les valeurs de la table de droite et seules les lignes qui correspondent à l'état de la table de gauche.
5.FULL JOIN : Full Join et Jointure externe Complète sont les mêmes.
1.Inner Join: Aussi appelé Rejoindre.Il retourne les lignes présent à la fois dans la table de Gauche, de droite et de table seulement si il y a un match.Sinon, elle renvoie zéro des enregistrements.
Exemple:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2.Jointure Externe Complète: Aussi appelé Full Join.Il retourne toutes les lignes présent à la fois dans la table de Gauche, et à droite de la table.
Exemple:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
3.Jointure Externe gauche: Ou tout simplement appelé Left Join.Elle renvoie toutes les lignes présentes dans la table de Gauche et la correspondance des lignes de la table de droite (le cas échéant).
4.Jointure Externe Droite: Aussi appelé comme Droit de la Rejoindre.Il renvoie les lignes correspondantes de la table de gauche (le cas échéant), et toutes les lignes présentes dans le tableau de Droite.
Avantages de Jointures
- Exécute plus rapidement.
Inner join - Un inner join en utilisant soit de l'équivalent des requêtes donne à l'intersection des deux tables, c'est à direles deux lignes qu'ils ont en commun.
Jointure externe gauche - Un jointure externe gauche donnera toutes les lignes dans Un, plus les communes de lignes de B.
Jointure externe complète - Un jointure externe complète vous donnera l'union de A et de B, c'est à direToutes les lignes de A et de toutes les lignes dans B.Si quelque chose ne dispose pas d'un correspondant donnée dans le B, le B partie est nulle, et vice versay
left join on
(aka left outer join on
) renvoie inner join on
les lignes union all
inégalée à gauche les lignes de la table prolongée par les valeurs null.
right join (on
aka right outer join on
) renvoie inner join on
les lignes union all
inégalée droit de lignes de la table prolongée par les valeurs null.
full join on
(aka full outer join on
) renvoie inner join on
les lignesunion all
inégalée à gauche les lignes de la table prolongée par les valeurs null union all
inégalée droit de lignes de la table prolongée par les valeurs null.
(Standard SQL 2006 SQL/Fondation De 7,7 Règles de Syntaxe 1, des Règles Générales 1 b, 3 c & d, 5. b.)
Donc, ne pas outer join
jusqu'à ce que vous savez ce sous-jacentes inner join
est impliqué.
En savoir les lignes inner join
retourne.
Lire mes commentaires il re les nombreux confus & poor'réponses.
Puis lire mes commentaires ici re les nombreux confus & poor'réponses.
La différence entre l'intérieur de la rejoindre et de la jointure externe est comme suit:
- Intérieure jointure est une jointure qui combiné basé sur des tables de correspondance des tuples, alors que la jointure est une jointure qui combiné table en se basant sur les deux jumelés et inégalée tuple.
- Inner join fusionne jumelés en rangée de deux table où inégalée ligne sont omis, alors que la jointure externe fusionne les lignes de deux tables et une des lignes de remplissage avec la valeur null.
- Jointure interne est comme une intersection, alors que la jointure externe est comme une union de l'opération.
- Jointure interne est de deux types, alors que la jointure externe sont de trois types.
- Jointure interne est plus lent, alors que la jointure externe est plus rapide que la jointure interne.
Considérons en dessous de 2 tables:
EMP
empid name dept_id salary
1 Rob 1 100
2 Mark 1 300
3 John 2 100
4 Mary 2 300
5 Bill 3 700
6 Jose 6 400
Département
deptid name
1 IT
2 Accounts
3 Security
4 HR
5 R&D
Inner Join:
Surtout écrit comme juste REJOINDRE dans les requêtes sql.Elle renvoie uniquement les enregistrements correspondants entre les tables.
Trouver tous les employés et le nom de leur service:
Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
Comme vous le voyez ci-dessus, Jose
n'est pas imprimé à partir de EMP dans la sortie comme il est dept_id 6
ne trouve pas de correspondance dans le Département de la table.De même, HR
et R&D
les lignes ne sont pas imprimés à partir de Département table, comme ils n'ont pas trouver une correspondance dans la table Emp.
Donc, INNER JOIN ou tout simplement REJOINDRE, il renvoie uniquement les lignes correspondantes.
LEFT JOIN :
Cela renvoie tous les enregistrements de la table de GAUCHE et uniquement les enregistrements correspondants de la table de DROITE.
Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
6 Jose
Donc, si vous observez les au-dessus de la sortie, tous les enregistrements de la table de GAUCHE(Emp) sont imprimées avec juste les enregistrements correspondants de la table de DROITE.
HR
et R&D
les lignes ne sont pas imprimés à partir de Département table, comme ils n'ont pas trouver une correspondance dans la table Emp sur dept_id.
Donc, LEFT JOIN renvoie TOUTES les lignes de la table de Gauche et seulement les lignes correspondantes de la table de DROITE.
Pouvez également vérifier DÉMO ici.