Question

Aussi comment faire LEFT JOIN, RIGHT JOIN et FULL JOIN fit-il?

Était-ce utile?

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.

  1. Imaginez une jointure croisée.
  2. É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
  3. (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.

enter image description here


Explication

Source Tables

enter link description here

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

enter link description here

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.

Inner Join

Version Animée

enter image description here

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.

inner 2

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.

LOJ

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.

loj is null

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.

ROJ

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.

FOJ

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

FOJ 2

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.

UNION ALL

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

LOJ

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

LOJtoInner

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"

enter image description here

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:

enter image description here

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

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

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

enter image description hereenter image description here

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

Source De L'Image

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

Oracle opérations de Jointure

Inner Join

Récupérer les lignes correspondantes seulement, c'est, A intersect B.

Enter image description here

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.

Enter image description here

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.

Enter image description here

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 :

Example

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 :

Diagram

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.

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

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

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:

  1. Prendre chaque ligne de la première table: a
  2. Envisager toutes les lignes à partir de la deuxième table à côté d'elle: (a, b[i])
  3. É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 de Null 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.

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:

Inner Join vs. Left Outer Join


enter image description here

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:

enter image description here

enter image description here

  • 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 que INNER JOIN, mais il a également inclus NULL les données sur le jeu de résultats.
    • LEFT JOIN = INNER JOIN + Inégalée de données de de gauche table avec Null match sur la table de droite.
    • RIGHT JOIN = INNER JOIN + Inégalée de données de droit table avec Null 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 des Null 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 et OUTER 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

output1

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

output2

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.

joins

Avantages de Jointures

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

  1. 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.
  2. 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.
  3. Jointure interne est comme une intersection, alors que la jointure externe est comme une union de l'opération.
  4. Jointure interne est de deux types, alors que la jointure externe sont de trois types.
  5. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top