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?

4099
demandé sur Matt Rowland 2008-09-02 02:36:06
la source

30 ответов

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
5506
répondu Mark Harrison 2017-09-28 22:52:04
la source

vous pouvez aussi considérer le schéma suivant pour différents types de jointure;

visual explanation of joins

Source: Visual-Représentation-de-SQL-Joint , a expliqué en détail par C. L. Moffatt

2476
répondu Teoman shipahi 2014-08-06 18:12:27
la source

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:

enter image description here

FULL Outer Join:

enter image description here

593
répondu ya23 2016-01-21 23:15:36
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 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.

  1. Imaginez une croix.
  2. évaluer la clause on par rapport à toutes les lignes de l'étape 1 garder ceux où le prédicat évalue à true
  3. (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.

enter image description here


explication

Tables De Source

enter link description here

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

enter link description here

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.

Inner Join

Version Animée

enter image description here

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.

inner 2

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.

LOJ

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.

loj is null

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.

ROJ

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.

FOJ

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é.

FOJ 2

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.

UNION ALL

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

LOJ

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

LOJtoInner

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

enter image description here

SQL Fiddle

Voir ces exemples exécuter en direct à SQLFiddle.com .

545
répondu Martin Smith 2018-08-03 10:59:59
la source

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.

294
répondu gtiwari333 2013-01-05 15:21:45
la source

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:

enter image description here

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: enter image description here enter image description here

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: enter image description here enter image description here

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:

enter image description here enter image description here

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. enter image description here

Image Source

MySQL 8.0 Manuel De Référence - La Syntaxe De Jointure

Oracle des opérations de Jointure

117
répondu ajitksharma 2018-08-07 17:38:49
la source

Joint Intérieur

récupère les lignes correspondant seulement, c'est-à-dire A intersect B .

Enter image description here

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.

Enter image description here

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.

Enter image description here

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Références

115
répondu Tushar Gupta 2014-07-21 19:38:32
la source

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

101
répondu vidyadhar 2014-07-21 19:35:37
la source

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.

93
répondu 1800 INFORMATION 2015-01-05 04:14:26
la source

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 .

68
répondu Brian Boatright 2018-09-10 11:25:51
la source

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:

Example

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 à :

Diagram

58
répondu Pratik C Joshi 2015-02-19 08:11:56
la source

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.

52
répondu vijikumar 2015-06-09 06:21:07
la source

This is a good explanation for joins

C'est une bonne explication schématique pour tous les types de jointures

source: http://ssiddique.info/understanding-sql-joins-in-easy-way.html

50
répondu Raghu K Nair 2016-10-18 21:48:59
la source

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.

48
répondu naga 2013-09-27 01:25:28
la source

la réponse est dans le sens de chacun, donc dans les résultats.

Note:

Dans SQLite il n'y a pas de RIGHT OUTER JOIN ou FULL OUTER JOIN .

Et aussi dans MySQL il n'y a pas de FULL 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 ;).

37
répondu shA.t 2017-09-12 11:50:33
la source

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 de LEFT 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?

28
répondu Aldee 2013-09-18 11:33:10
la source

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).

28
répondu Kanwar Singh 2016-02-02 14:14:00
la source

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:

22
répondu Lajos Veres 2017-05-23 15:34:48
la source

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).

21
répondu Rahul Parit 2015-06-15 07:41:04
la source

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:

enter image description here

18
répondu onedaywhen 2016-01-22 18:23:20
la source

l'algorithme précis pour INNER JOIN , LEFT/RIGHT OUTER JOIN sont les suivants:

  1. prenez chaque ligne du premier tableau: a
  2. considérez toutes les lignes de la deuxième table à côté de lui: (a, b[i])
  3. é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 utilisant Null 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.

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:

Inner Join vs. Left Outer Join


enter image description here

Note: Jointure Gauche = Jointure Extérieure Gauche, Jointure Droite = Jointure Extérieure Droite.

16
répondu S.Serpooshan 2018-10-11 17:16:16
la source

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.

15
répondu Sumudu De Zoysa 2015-09-07 13:53:13
la source

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

15
répondu Akshay Khale 2016-04-28 12:10:48
la source

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

12
répondu AVI 2015-12-20 04:30:53
la source

enter image description here

  • 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 le INNER JOIN , mais également NULL 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 et OUTER 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 
12
répondu Premraj 2018-03-25 10:34:09
la source

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'utiliser RIGHT !
  • le OUTER mot-clé de LEFT 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 .

9
répondu onedaywhen 2018-04-19 15:48:44
la source
  • 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

4
répondu Sandesh 2016-06-23 16:55:57
la source

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.

4
répondu Anands23 2016-10-13 12:04:54
la source

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

output1

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

output2

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.

joins

avantages des joints

  1. S'exécute plus vite.
3
répondu Laxmi 2017-07-28 07:17:49
la source

la différence entre la jointure intérieure et la jointure extérieure est la suivante:

  1. 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.
  2. 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.
  3. La jonction intérieure est comme une opération d'intersection, tandis que la jonction extérieure est comme une opération syndicale.
  4. jonction intérieure est de deux types, tandis que la jonction extérieure sont de trois types.
  5. La jonction interne
  6. est plus lente, tandis que la jonction externe est plus rapide que la jonction interne.
1
répondu rashedcs 2017-10-17 15:25:56
la source

Autres questions sur sql join database inner-join outer-join