Quelle est la différence entre "joint intérieur" et "joint extérieur"?
comment LEFT JOIN
, RIGHT JOIN
et FULL JOIN
s'intègrent-ils?
30 réponses
en supposant que vous rejoignez sur des colonnes sans doublons, ce qui est un cas très courant:
-
une jonction interne de A et B donne le résultat d'un intersect B, c'est-à-dire la partie interne d'une intersection diagramme de Venn .
-
une jointure extérieure de A et B donne les résultats d'une union B, c.-à-d. les parties extérieures d'une union de diagramme de Venn.
exemples
supposons que vous ayez deux tableaux, avec une seule colonne chacun, et les données comme suit:
A B
- -
1 3
2 4
3 5
4 6
noter que (1,2) sont uniques à A, (3,4) sont communs, et (5,6) sont uniques à B.
Inner join
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 dans 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
LEFT outer join
une jointure extérieure gauche donnera toutes les lignes en A, plus toutes les lignes communes en 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 jonction extérieure droite donnera toutes les rangées en B, plus toutes les rangées communes 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
Full outer join
la jointure externe 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 une donnée correspondante dans B, alors la partie B 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
vous pouvez aussi considérer le schéma suivant pour différents types de jointure;
Source: Visual-Représentation-de-SQL-Joint , a expliqué en détail par C. L. Moffatt
je recommande de Jeff article du blog . La meilleure description que j'ai jamais vu, plus il ya une visualisation, par exemple:
Jonction Intérieure:
FULL Outer Join:
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 les différents types de prédicat de jointure ou de fournir un cadre de raisonnement sur la façon dont ils vont fonctionner.
il n'y a pas de substitut pour comprendre le traitement logique et il est relativement simple à saisir de toute façon.
- Imaginez une croix.
- évaluer la clause
on
par rapport à toutes les lignes de l'étape 1 garder ceux où le prédicat évalue àtrue
- (pour jointures externes seulement) ajouter les lignes externes perdues à l'étape 2.
(NB: en pratique l'optimiseur de requête 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 same)
je vais commencer avec une version animée d'un FULL outer join . D'autres explications suivent.
explication
Tables De Source
premier départ avec un CROSS JOIN
(Alias Cartesian Product). Ceci n'a pas de clause ON
et renvoie simplement chaque combinaison de lignes des deux tables.
sélectionner A. Couleur, B. Couleur D'une croix joindre B
joint intérieur et extérieur ont une clause" ON " prédicate.
- Inner Jointure. évaluer la condition dans le"" clause pour toutes les lignes de la jointure croisée résultat. Si true, retournez la rangée jointe. Sinon l'éliminer.
- Joint Extérieur Gauche. identique à inner join puis pour toutes les lignes dans la table de gauche qui ne correspondent à rien sortie ces valeurs nulles pour les colonnes de la table de droite.
- Jointure Externe Droite. identique à inner join puis pour toutes les lignes dans la table de droite qui ne correspondent à rien sortie ceux-ci avec NULL valeurs pour les colonnes du tableau de gauche.
- Jointure Externe Complète. identique à la jointure intérieure, puis conserver les rangées gauches non appariées comme dans la jointure extérieure gauche et les rangées droites non appariées comme dans la jointure extérieure droite.
quelques exemples
sélectionner A. Couleur, B. Couleur À partir D'une jointure intérieure B on A. Couleur = B. Couleur
ci-dessus est le classique équi-jointure.
Version Animée
sélectionner A. Couleur, B. Couleur À partir d'une jointure intérieure B ON A. Couleur non indiquée ('Vert','Bleu')
la condition de jonction intérieure ne doit pas nécessairement être une condition d'égalité et n'a pas besoin de faire référence à des colonnes des deux (ou même de l'un ou l'autre) des tableaux. Evaluer A.Colour NOT IN ('Green','Blue')
sur chaque ligne de la Croix joindre les retours.
sélectionner A. Couleur, B. Couleur À partir D'une jointure intérieure B ON 1 = 1
la condition de jointure évalue à true pour toutes les lignes dans le résultat de jointure croisée donc c'est juste la même chose qu'une jointure croisée. Je ne vais pas répéter l'image des 16 rangées.
sélectionner A. Couleur, B. Couleur À partir de la jointure extérieure gauche B ON A. Couleur = B. Couleur
les jointures externes sont logiquement évaluées de la même manière que les jointures internes, sauf que si une rangée de la table de gauche (pour une jointure gauche) ne se joint à aucune rangée de la table de droite, elle est conservée dans le résultat avec les valeurs NULL
pour les colonnes de droite.
sélectionner A. Couleur, B. Couleur À partir de la jointure extérieure gauche B ON A. Couleur = B. Couleur où B. Couleur est nulle
cela restreint simplement le résultat précédent à retourner Seulement les lignes où B.Colour IS NULL
. Dans ce cas particulier, ce sont les lignes qui ont été préservées car elles n'avaient aucune correspondance dans la table de droite et la requête renvoie la seule ligne rouge non appariée dans la table B
. Ceci est connu sous le nom d'anti semi jointure.
il est important de choisir une colonne pour le critère IS NULL
qui n'est pas nulle ou pour laquelle la condition de jointure garantit que toutes les valeurs NULL
seront exclues pour que ce modèle fonctionne correctement et éviter de simplement ramener des lignes qui ont une valeur NULL
pour cette colonne en plus des lignes non appariées.
sélectionner A. Couleur, B. Couleur À partir D'une jointure extérieure droite B ON A. Couleur = B. Couleur
droit jointures externes agir de la même façon à gauche jointures externes sauf qu'ils préservent non les lignes correspondantes de la table de droite et null étendent les colonnes de gauche.
sélectionner A. Couleur, B. Couleur À partir D'une jointure extérieure complète B ON A. Couleur = B. Couleur
Full outer jointures combiner le comportement des jointures gauche et droite et préserver les lignes non appariées des tables de gauche et de droite.
Choisir A. Couleur, B. Couleur À partir D'une jointure extérieure complète B ON 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 préservées en utilisant les règles normales de jointure externe avec NULL dans les colonnes de la table de l'autre côté.
sélectionner COALESCE (A. Couleur, B. Couleur) Comme Couleur À partir D'une jointure extérieure complète B ON 1 = 0
avec une modification mineure pour la requête précédente on pourrait simuler un UNION ALL
des deux tables.
sélectionner A. Couleur, B. Couleur À partir de la jointure extérieure gauche B ON A. Couleur = B. Couleur où B. Couleur = "Vert
notez que la clause WHERE
(si elle existe) court logiquement après la jointure. Une erreur courante est d'effectuer une jointure externe gauche et ensuite inclure une clause où avec une condition sur la table de droite qui finit par exclure les lignes non correspondantes. Le dessus finit par exécuter la jointure extérieure...
... Et puis la clause" où " court. NULL= 'Green'
n'évalue pas à vrai de sorte que la rangée préservée par la jointure externe finit par jeter (avec le bleu) convertir effectivement le retour de jointure à un intérieur.
si l'intention était d'inclure seulement les lignes de B où la couleur est verte et toutes les lignes de A indépendamment de la syntaxe correcte serait
sélectionner A. Couleur, B. Couleur À partir de la jointure extérieure gauche B ON A. Couleur = B. Couleur et B. Couleur = "Vert
SQL Fiddle
Voir ces exemples exécuter en direct à SQLFiddle.com .
Le suivant est tiré de l'article " MySQL - LEFT JOIN et RIGHT JOIN, JOINTURE INTERNE et EXTERNE REJOINDRE " par Graham Ellis sur son blog de la Bouche des Chevaux.
dans une base de données telle que MySQL, les données sont divisées en un certain nombre de tables qui sont ensuite connectés ( Joined
) ensemble par JOIN
dans SELECT
commandes pour lire des enregistrements à partir de plusieurs tables. Lisez cet exemple pour voir comment il fonctionne.
D'abord, certains échantillon:
people
mysql> select * from people;
+------------+--------------+------+
| name | phone | pid |
+------------+--------------+------+
| Mr Brown | 01225 708225 | 1 |
| Miss Smith | 01225 899360 | 2 |
| Mr Pullen | 01380 724040 | 3 |
+------------+--------------+------+
3 rows in set (0.00 sec)
property
mysql> select * from property;
+------+------+----------------------+
| pid | spid | selling |
+------+------+----------------------+
| 1 | 1 | Old House Farm |
| 3 | 2 | The Willows |
| 3 | 3 | Tall Trees |
| 3 | 4 | The Melksham Florist |
| 4 | 5 | Dun Roamin |
+------+------+----------------------+
5 rows in set (0.00 sec)
RÉGULIER REJOINDRE
si nous faisons une jointure régulière (sans aucun des mots clés INNER, OUTER, LEFT ou RIGHT), alors nous obtenons tous les enregistrements qui correspondent de la manière appropriée dans les deux tables, et les enregistrements dans les deux tables entrantes qui ne correspondent pas ne sont pas signalés:
mysql> select name, phone, selling
from people join property
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name | phone | selling |
+-----------+--------------+----------------------+
| Mr Brown | 01225 708225 | Old House Farm |
| Mr Pullen | 01380 724040 | The Willows |
| Mr Pullen | 01380 724040 | Tall Trees |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)
LEFT JOIN
si nous faisons une jonction à gauche, nous obtenons tout enregistrements qui correspondent de la même manière et en plus nous obtenons un enregistrement supplémentaire pour chaque enregistrement non apparié dans la table de gauche de la jointure - assurant ainsi (dans cet exemple) que chaque personne obtient une mention:
mysql> select name, phone, selling
from people left join property
on people.pid = property.pid;
+------------+--------------+----------------------+
| name | phone | selling |
+------------+--------------+----------------------+
| Mr Brown | 01225 708225 | Old House Farm |
| Miss Smith | 01225 899360 | NULL <<-- unmatch |
| Mr Pullen | 01380 724040 | The Willows |
| Mr Pullen | 01380 724040 | Tall Trees |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+------------+--------------+----------------------+
5 rows in set (0.00 sec)
RIGHT JOIN
si nous faisons une jointure droite, nous obtenons tous les enregistrements qui correspondent et en plus un enregistrement supplémentaire pour chaque enregistrement non apparié dans la table droite de la jointure - dans mon exemple, cela signifie que chaque la propriété obtient une mention même si nous n'avons pas les détails du vendeur:
mysql> select name, phone, selling
from people right join property
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name | phone | selling |
+-----------+--------------+----------------------+
| Mr Brown | 01225 708225 | Old House Farm |
| Mr Pullen | 01380 724040 | The Willows |
| Mr Pullen | 01380 724040 | Tall Trees |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL | NULL | Dun Roamin |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)
une jointure interne fait une jointure complète, tout comme le premier exemple, et le mot externe peut être ajouté après le mot gauche ou droite dans les deux derniers exemples - il est prévu pour la compatibilité ODBC et n'ajoute pas de capacités supplémentaires.
Joins sont utilisés pour combiner les données de deux tableaux, avec le résultat étant une nouvelle table temporaire. Les jointures sont effectuées à partir de quelque chose appelé un prédicat, qui spécifie la condition à utiliser afin d'effectuer une jointure. La différence entre une jointure interne et une jointure externe est qu'une jointure interne retournera seulement les lignes qui correspondent réellement basé sur le prédicat de jointure. Examinons la table des employés et des lieux:
Jonction Intérieure: - Inner join crée une nouvelle table de résultat en combinant les valeurs de colonne de deux tables ( employé et emplacement ) basé sur le prédicat de jointure. La requête compare chaque ligne de Employé à chaque ligne de Emplacement pour trouver toutes les paires de lignes qui satisfont la jointure-prédicat. Lorsque l' la variable join-predicate est satisfaite en appariant les valeurs non nulles, les valeurs des colonnes pour chaque paire de rangées appariées de employé et emplacement sont combinées dans une rangée de résultats. Voici à quoi ressemblera le SQL pour une jonction intérieure:
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 Extérieure: - Une jointure externe n'exige pas que chaque enregistrement dans les deux tables jointées ait un enregistrement correspondant. La table jointe conserve chaque dossier-même si aucun autre enregistrement correspondant existe. Les jointures externes se subdivisent en jointures externes gauches et jointures externes droites, selon les lignes de la table qui sont retenues (gauche ou droite).
Raccord Extérieur Gauche: - Le résultat d'une jointure externe gauche (ou simplement une jointure gauche) pour les tables Employé et Emplacement contient toujours tous les enregistrements de la "gauche" du tableau ( Employé ), même si la jointure condition ne trouve aucun enregistrement correspondant dans le "droit" ( Emplacement ). Voici à quoi ressemblerait le SQL pour une jointure externe gauche, en utilisant les tables ci-dessus:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
maintenant, voici à quoi ressemblerait le résultat de l'exécution de ce SQL:
Droit Joint Extérieur: - Une jointure externe droite (ou jointure droite) ressemble étroitement à une jointure externe gauche, sauf avec le traitement des tables inversées. Chaque ligne de la "droite" ( Emplacement ) apparaîtra dans la table jointe au moins une fois. Si aucune ligne correspondante de la table "gauche" ( employé ), NULL, apparaissent dans les colonnes de Employé pour les enregistrements qui n'ont pas de correspondance dans Emplacement . Voici à quoi ressemble le SQL:
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
en utilisant les tableaux ci-dessus, nous pouvons montrer à quoi ressemblerait l'ensemble de résultats d'une jointure extérieure droite:
Full Joints Extérieurs: - 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 tableaux, indépendamment du fait que l'autre tableau ait ou non une valeur correspondante.
Joint Intérieur
récupère les lignes correspondant seulement, c'est-à-dire A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
LEFT Outer Join
Sélectionner tous les enregistrements de la première table, et tous les enregistrements dans la deuxième table qui correspond aux clés jointes.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
FULL Outer Join
Sélectionner tous les enregistrements de la deuxième table, et tous les enregistrements dans la première table qui correspond aux clés jointes.
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.
, tandis qu'un OUTER join récupère les lignes correspondantes d'une table et de toutes les lignes d'une autre table ....le résultat dépend de ce que vous utilisez:
-
gauche : lignes correspondantes dans le tableau de droite et toutes les lignes dans le tableau de gauche
-
"Right : lignes correspondantes dans le tableau de gauche et toutes les lignes dans le tableau de droite ou
-
Full : toutes les lignes dans tous les tableaux. Il n'a pas d'importance si il y a un match ou pas
une jointure intérieure montre seulement des lignes s'il y a un enregistrement correspondant sur l'autre côté (droit) de la jointure.
a (gauche) jointure externe montre des lignes pour chaque enregistrement sur le côté gauche, même s'il n'y a pas de lignes correspondantes sur l'autre (Droite) côté de la jointure. S'il n'y a pas de ligne correspondante, les colonnes de l'autre côté (à droite) afficheront NULLs.
jointures internes nécessitent qu'un enregistrement avec une relative ID existent dans la table jointe.
Outer jointures retournera les enregistrements pour le côté gauche même si rien n'existe pour le côté droit.
par exemple, vous avez une table Commandes et commandes. Ils sont liés par un "Ordéride".
Commandes
- OrderID
- CustomerName
OrderDetails
- OrderDetailID
- OrderID
- Nomduproduit
- Qty
- prix
la requête
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
ne retournera que les commandes qui ont aussi quelque chose dans la table OrderDetails.
si vous le changez en EXTÉRIEUR LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
alors il retournera les enregistrements de la table Orders même s'ils n'ont pas D'enregistrements OrderDetails.
vous pouvez utiliser ceci pour trouver des commandes qui n'ont pas de détails d'ordre indiquant un ordre orphelin possible en ajoutant une clause où comme WHERE OrderDetails.OrderID IS NULL
.
en termes simples:
Inner join - > prendre seulement les enregistrements communs des tables parent et enfant où la clé primaire de la table Parent correspond clé étrangère dans la table enfant.
LEFT join - >
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.
}
}
RIGHT join : exactement en face de la gauche . Mettre le nom de la table à gauche joindre à droite dans la jointure droite, vous obtenez la même sortie que la jointure gauche.
OUTER join : afficher tous les enregistrements dans les deux tableaux No matter what
. Si les enregistrements dans la table de gauche ne correspondent pas à la table de droite basée sur Primaire , Forieign key , utilisez la valeur nulle à la suite de jointure .
exemple:
supposons maintenant pour 2 tables
1.employees , 2.phone_numbers_employees
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
ici, la table des employés est la table principale, phone_number_employees est la table enfant(elle contient emp_id
comme clé étrangère qui connecte employee.id
ainsi sa table enfant.)
jointures internes
prendre les enregistrements de 2 tables seulement si la table clé primaire des employés (son id) correspond à la table clé étrangère des enfants phone_numbers_ employees(emp_id) .
donc 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;
ne prendre ici que les lignes correspondant à la clé primaire = clé étrangère comme expliqué ci-dessus.Ici les lignes qui ne correspondent pas sur la clé primaire = clé étrangère sont sautées à la suite de jointure.
Left join :
gauche jointure conserve toutes les lignes de la table de gauche, indépendamment de savoir s'il ya une ligne qui correspond sur 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;
joints extérieurs :
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;
schématiquement, il ressemble à :
vous utilisez INNER JOIN
pour retourner toutes les lignes des deux tables où il y a une correspondance. i.e. dans le tableau résultant toutes les lignes et les colonnes auront des valeurs.
dans OUTER JOIN
le tableau résultant peut comporter des colonnes vides. La jointure extérieure peut être LEFT
ou RIGHT
.
LEFT OUTER JOIN
renvoie toutes les lignes de la première table, même s'il n'y a pas allumettes dans la deuxième table.
RIGHT OUTER JOIN
renvoie toutes les lignes de la deuxième table, même s'il n'y a pas de correspondance dans la première.
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
exige qu'il y ait au moins une correspondance entre les deux tableaux. Par exemple, le tableau A et le tableau B, qui impliquent une application de la Convention relative aux droits de l'enfant (a 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 concordant dans les deux tableaux et toutes les possibilités de la droite table.
FULL JOIN
est la combinaison de LEFT OUTER JOIN
et RIGHT OUTER JOIN
sans duplication.
la réponse est dans le sens de chacun, donc 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 .
Quand vous avez deux tables comme ceux-ci:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
ASSEMBLAGE TRANSVERSAL / EXTÉRIEUR:
Vous pouvez avoir toutes ces données de tableaux 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
JONCTION INTÉRIEURE:
Quand vous voulez ajouter un filtre aux résultats ci-dessus 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
JOINTURE GAUCHE:
Lorsque vous voulez avoir toutes les lignes d'un des tableaux dans le résultat ci-dessus-avec la même relation - vous pouvez utiliser LEFT JOIN
:
(Pour droit rejoindre juste changer la place des 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 EXTÉRIEURE 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, comme votre besoin vous choisissez chacun qui couvre votre besoin ;).
la différence réside dans la façon dont les tables sont jointes s'il n'y a pas de notices communes.
-
JOIN
est identique àINNER JOIN
et signifie qu'il n'y a que des enregistrements communs aux deux tableaux. Si les enregistrements sont communs est déterminé par les champs dans la clause join. Par exemple:FROM t1 JOIN t2 on t1.ID = t2.ID
signifie afficher seulement les enregistrements où la même valeur
ID
existe dans les deux tableaux. -
LEFT JOIN
est identique àLEFT OUTER JOIN
et signifie afficher tous les enregistrements de la table de gauche (c.-à-d. celui qui précède dans L'énoncé SQL) indépendamment de l'existence des enregistrements correspondants dans la table de droite. -
RIGHT JOIN
est identique àRIGHT OUTER JOIN
et signifie le contraire deLEFT JOIN
, c'est-à-dire qu'il montre tous les enregistrements du deuxième tableau (à droite) et seulement les enregistrements correspondants du premier tableau (à gauche).
Source: Quelle est la différence entre LEFT, RIGHT, INNER, OUTER, JOIN?
interior join.
une jointure est la combinaison des lignes de deux tables. Un inner join tente 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. S'il y a une rangée dans la première table qui ne correspond pas à une rangée dans la seconde, c'est non retourné; de même, s'il y a une rangée dans la deuxième table qui ne correspond pas à une rangée dans la première, elle n'est pas retournée.
Outer Jointure.
A LEFT join tente de trouver une correspondance entre les lignes du premier tableau et les lignes du deuxième tableau. S'il ne trouve pas de correspondance, il renvoie les colonnes de la première table et laisse les colonnes de la deuxième table vides (null).
Je ne vois pas beaucoup de détails sur la performance et l'optimiseur dans les autres réponses.
parfois, il est bon de savoir que seul 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 gardant le même résultat. L'optimiseur peut utiliser les modes de jointure les plus nombreux.
il est Généralement une bonne pratique d'essayer d'utiliser INNER JOIN
au lieu de les différents types de jointures. (De cours Si cela est possible compte tenu de l'ensemble des résultats attendus.)
il y a ici quelques bons exemples et explications de ce comportement associatif étrange:
la différence réside dans la façon dont les tables sont jointes s'il n'y a pas de notices communes.
JOIN
est identique à INNER JOIN
et signifie qu'il n'y a que des enregistrements communs aux deux tableaux. Si les enregistrements sont communs est déterminé par les champs dans la clause join.
par exemple:
SELECT *
FROM t1
JOIN t2 on t1.ID = t2.ID
cela signifie afficher seulement les enregistrements où la même valeur ID
existe dans les deux tableaux.
LEFT JOIN
est identique à LEFT OUTER JOIN
et signifie afficher tous les enregistrements de la table de gauche (c.-à-d. celui qui précède dans l'énoncé SQL) indépendamment de l'existence des enregistrements correspondants dans la table de droite.
RIGHT JOIN
est identique à RIGHT OUTER JOIN
et signifie le contraire de LEFT JOIN
, c'est-à-dire montre tous les enregistrements de la deuxième table (droite) et seulement les enregistrements correspondants de la première table (gauche).
après avoir critiqué le très aimé diagramme rouge-ombragé de Venn, j'ai pensé qu'il était juste de poster ma propre tentative.
bien que la réponse de @Martin Smith soit la meilleure de ce groupe de longue date, il ne montre que la colonne clé de chaque tableau, alors que je pense qu'idéalement les colonnes non-clés devraient également être affichées.
le mieux que j'ai pu faire dans la demi-heure autorisée, Je ne pense toujours pas qu'il montre de manière adéquate que les nulls sont là en raison de l'absence de valeurs clés dans TableB
ou que OUTER JOIN
est en fait une union plutôt que d'une jointure:
l'algorithme précis pour INNER JOIN
, LEFT/RIGHT OUTER JOIN
sont les suivants:
- prenez chaque ligne du premier tableau:
a
- considérez toutes les lignes de la deuxième table à côté de lui:
(a, b[i])
- évaluer la clause
ON ...
par paire:ON( a, b[i] ) = true/false?
- lorsque la condition est évaluée à
true
, retournez cette rangée combinée(a, b[i])
. - lorsque reach fin de la deuxième table sans aucune correspondance, et il s'agit d'un
Outer Join
puis retourner une (virtuelle) paire en utilisantNull
pour toutes les colonnes d'une autre table:(a, Null)
pour la jointure extérieure gauche ou(Null, b)
pour la jointure extérieure droite. Il s'agit de s'assurer que toutes les lignes du premier tableau existent dans les résultats finaux.
- lorsque la condition est évaluée à
Note: la condition spécifiée dans ON
clause pourrait être n'importe quoi, il n'est pas nécessaire d'utiliser clés primaires (et vous n'avez pas besoin de toujours se référer aux colonnes des deux tableaux)! Par exemple:
-
... ON T1.title = T2.title AND T1.version < T2.version
( => voir ce message comme un exemple d'usage: sélectionner seulement les lignes avec la valeur maximale sur une colonne ) -
... ON T1.y IS NULL
-
... ON 1 = 0
(comme échantillon)
Note: Jointure Gauche = Jointure Extérieure Gauche, Jointure Droite = Jointure Extérieure Droite.
Inner Join Une jointure interne se concentre sur la communauté entre deux tables. Lors de l'utilisation d'une jointure interne, il doit y avoir au moins quelques données de correspondance entre deux (ou plus) tables qui sont comparées. Une jointure interne recherche des tables pour apparier ou chevaucher des données. Une fois trouvé, le joint intérieur combine et renvoie l'information dans une nouvelle table.
Joint Extérieur Une jointure externe renvoie un jeu d'enregistrements (ou lignes) qui comprennent ce qu'un la jointure interne retournerait mais inclurait aussi d'autres lignes pour lesquelles aucune correspondance n'est trouvée dans l'autre tableau.
il existe trois types de jointures extérieures:
jointure extérieure gauche (ou jointure gauche) Droite jointure externe (ou droite jointure)) Jointure extérieure complète (ou jointure complète)) Chacune de ces jointures externes fait référence à la partie des données qui est comparée, combinée, et retournée. Parfois nulls seront produits dans ce processus que certaines données est partagé, tandis que d'autres données ne l'est pas.
Définitions Les Plus Simples
Inner Join: Renvoie dossiers appariés à partir des deux tables.
Full Outer Join: Retourne appariés et les enregistrements sans correspondance à partir de deux tableaux avec des valeurs null pour les enregistrements sans correspondance de les Deux Tables .
joint externe gauche: retours appariés et enregistrements non appariés seulement de la table sur côté gauche .
droit Extérieur jointure: retours appariés et enregistrements non appariés seulement à partir de la table sur côté droit .
En Bref
Correspond + À Gauche Inégalée + Droit Inégalée = Full Outer Join
Matched + Left Unmatched = LEFT Outer Join
Matched + Droit Inégalée = Jointure Externe Droite
Matched = Inner Join
JONCTION INTÉRIEURE
une jointure interne produit un jeu de résultats qui est limité aux lignes où il y a une correspondance dans les deux tables pour ce que nous recherchons. Si vous ne savez pas quel type de joindre vous avez besoin, ce sera généralement votre meilleur pari.
RACCORD EXTÉRIEUR GAUCHE
une jointure externe gauche, ou jointure gauche, résulte en un ensemble où tous les rangs du Premier, ou à gauche, le tableau est conservé. Les rangées de la deuxième table ou de la table de droite ne s'affichent que si elles correspondent aux rangées de la première table. Lorsqu'il y a des valeurs de la table de gauche mais pas de la droite, la table se lira null, ce qui signifie que la valeur n'a pas été définie.
DROIT JOINT EXTÉRIEUR
une jointure extérieure droite, ou jointure droite, est la même qu'une jointure gauche, sauf que les rôles sont inversés. Toutes les rangées de la côté droit de la table de montrer dans le résultat, mais les lignes de la table sur la gauche sont là seulement s'ils correspondent à la table de droite. Les espaces vides sont nuls, tout comme la jointure de gauche.
FULL OUTER JOIN
une jointure extérieure complète, ou simplement une jointure extérieure, produit un ensemble de résultats avec toutes les lignes des deux tables, indépendamment du fait qu'il y ait des correspondances. De la même façon que les joints gauche et droite, nous appelons le vide espaces null.
Pour Plus De Référence
-
INNER JOIN
jointure la plus typique pour deux ou plusieurs tables. Il renvoie la correspondance de données sur les deux tables de la relation primarykey et forignkey. -
OUTER JOIN
est le même que leINNER JOIN
, mais égalementNULL
données sur le jeu de résultats.-
LEFT JOIN
=INNER JOIN
+ données non appariées de la table de gauche avec correspondance nulle sur la table de droite. -
RIGHT JOIN
=INNER JOIN
+ données non appariées de la table de droite avec correspondance nulle sur la table de gauche. -
FULL JOIN
=INNER JOIN
+ données non appariées sur les tables de droite et de gauche avec correspondances nulles.
-
- SELF join n'est pas un mot-clé dans SQL, quand une table renvoie des données en elle-même sait comme SELF join. En utilisant
INNER JOIN
etOUTER JOIN
nous pouvons écrire des requêtes d'auto-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
Quelle est la différence entre "joint intérieur" et "joint extérieur"?
ce sont les opérateurs existentiels les plus couramment utilisés en SQL, où INNER JOIN
est utilisé pour" existe " et LEFT OUTER JOIN
est utilisé pour "n'existe pas".
considérez ces requêtes:
users who have posted and have votes
users who have posted but have no badges
les personnes qui cherchent des solutions basées sur des ensembles (un terme de l'industrie) reconnaîtraient les requêtes respectives comme:
users who have posted INTERSECT users who have votes
users who have posted MINUS users who have badges
Traduire ceux-ci en standard SQL:
SELECT UserId FROM Posts
INTERSECT
SELECT UserId FROM Votes;
SELECT UserId FROM Posts
EXCEPT
SELECT UserId FROM Badges;
D'autres penseront sur le même modèle d'inclusion:
users who have posted and IN the set of users who have votes
users who have posted and NOT IN the set of users who have badges
Traduire ceux-ci en standard SQL:
SELECT UserId
FROM Posts
WHERE UserId IN ( SELECT UserId FROM Votes );
SELECT UserId
FROM Posts
WHERE UserId NOT IN ( SELECT UserId FROM Badges );
certains penseront en termes d '"existence" à l'intérieur des ensembles par exemple
users who have posted and EXIST in the set of users who have votes
users who have posted and do NOT EXIST in the set of users who have badges
traduisant ceux-ci en SQL standard (notez que nous devons maintenant utiliser des variables de gamme i.e. p
, v
, b
):
SELECT p.UserId
FROM Posts p
WHERE EXISTS ( SELECT *
FROM Votes v
WHERE v.UserId = p.UserId );
SELECT p.UserId
FROM Posts p
WHERE NOT EXISTS ( SELECT *
FROM Badges b
WHERE b.UserId = p.UserId );
cependant, j'ai trouvé que l'approche "norme de l'industrie" est d'utiliser exclusivement des joints. Je ne sais pas ce que la pensée est ici ( Droit de l'Instrument ? optimisation prématurée ?), donc je vais aller directement à la syntaxe:
SELECT p.UserId
FROM Posts p
INNER JOIN Votes v ON v.UserId = p.UserId;
SELECT p.UserId
FROM Posts p
LEFT JOIN Badges b ON b.UserId = p.UserId
WHERE b.UserId IS NULL;
choses à noter:
- la seule projection est de
Users
mais nous avons encore besoin de toutes ces variables de gamme(p
,v
,b
) for search conditions. - la "condition de recherche 1519170920" appartient à la
OUTER JOIN
mais est déconnectée dans la requête. -
LEFT
est la norme de l'industrie: les professionnels vont réécrire une requête pour éviter d'utiliserRIGHT
! - le
OUTER
mot-clé deLEFT OUTER JOIN
est omis.
observations finales:
parfois les jointures sont utilisées dans les requêtes uniquement pour déterminer si des valeurs existent ou non dans un autre ensemble. Apprenez à regarder attentivement les attributs projetés (les colonnes dans la clause SELECT
): s'il n'y en a pas dans la table jointe, alors ils sont simplement utilisés comme opérateurs existentiels. De plus, pour les jointures externes, cherchez les instances de <key_column> IS NULL
dans la clause WHERE
.
-
Inner join - un inner join en utilisant l'une des requêtes équivalentes donne l'intersection des deux tables , c.-à-d. les deux lignes qu'ils ont en commun.
-
"LEFT outer join - A "left outer join donnera toutes les rangées en A, plus toutes les rangées en B.
-
Full outer join - Un full outer join vous donnera l'union de A et de B, c'est à dire Toutes 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
En Termes Simples,
1. INNER JOIN ou EQUI JOIN: renvoie le jeu de résultats qui ne correspond qu'à la condition dans les deux tables.
2. OUTER JOIN: renvoie le jeu de résultats de toutes les valeurs des deux tables, même s'il y a correspondance de condition ou non.
3. LEFT JOIN: renvoie le jeu de résultats de toutes les valeurs de la table de gauche et seulement les lignes qui correspond à la condition dans la table de droite.
4. RIGHT JOIN: renvoie le résultat de toutes les valeurs de la table de droite et seulement les lignes qui correspondent à la condition dans la table de gauche.
5. full JOIN: Full Join et Full outer Join sont les mêmes.
1. jonction intérieure: aussi appelé jointure. Il renvoie les lignes présentes dans la table de gauche, et dans la table de droite seulement s'il y a une correspondance . Sinon, il ne renvoie aucun enregistrement.
exemple:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2. FULL Outer jointure: Also called as Full jointure. Il renvoie tous les les lignes sont présentes dans la table de gauche et dans la table de droite.
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 simplement appelé comme jointure gauche. Il renvoie toutes les lignes présentes dans la table de gauche et les lignes correspondantes de la table de droite (le cas échéant).
4. droit Extérieur jointure: aussi appelé droit 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 des joints
- S'exécute plus vite.
la différence entre la jointure intérieure et la jointure extérieure est la suivante:
- Inner join est une jointure qui combinait des tables basées sur des tuples assortis, tandis que la jointure externe est une jointure qui combinait des tables basées à la fois sur des tuples appariés et non appariés.
- merges de jointure intérieure ligne appariée à partir de deux tables où ligne non appariée sont omis, tandis que les rangées de jointure extérieure merges à partir de deux tables et les rangées non appariées remplir avec la valeur nulle.
- La jonction intérieure est comme une opération d'intersection, tandis que la jonction extérieure est comme une opération syndicale.
- jonction intérieure est de deux types, tandis que la jonction extérieure sont de trois types. La jonction interne
- est plus lente, tandis que la jonction externe est plus rapide que la jonction interne.