Différence entre la jointure gauche et la jointure droite dans SQL Server


225

Je connais les jointures dans SQL Server.

Par exemple. Il existe deux tableaux Tableau1, Tableau2.

Leurs structures de table sont les suivantes.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Données du tableau 1 comme suit:

    Id     Name     
    -------------
    1      A        
    2      B    

Données du tableau 2 comme suit:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Si j'exécute les deux instructions SQL mentionnées ci-dessous, les deux sorties seront les mêmes

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

Veuillez expliquer la différence entre la jointure gauche et droite dans les instructions SQL ci-dessus.

Réponses:


73
Select * from Table1 left join Table2 ...

et

Select * from Table2 right join Table1 ...

sont en effet complètement interchangeables. Essayez cependant Table2 left join Table1(ou sa paire identique Table1 right join Table2) de voir une différence. Cette requête devrait vous donner plus de lignes, car Table2 contient une ligne avec un identifiant qui n'est pas présent dans Table1.


17
Alors, pourquoi avons-nous besoin RIGHT JOINsi nous pouvons atteindre le résultat souhaité avec juste LEFT JOIN? : P
user1857492

1
@SilapAliyev C'est en fait une très bonne question. Quelqu'un peut-il répondre? : D
Ian Chu Te

21
Select * from Table1 left join Table 2renverra TOUS les enregistrements du tableau 1 plus les enregistrements coïncidents du tableau 2. L'inverse Select * from Table1 right join Table 2retournera TOUS les enregistrements du tableau 2 et les enregistrements coïncidents du tableau 1. J'espère que cela aide.
Programador Adagal

3
si vous utilisez plus de 2 tables, l'utilisation de la jointure droite peut être significative et lisible
ʞɔıɥʇɹɐʞ ouɐɯ

1
@MarkusMeskanen vous changez une simple phrase de 7 mots. Lorsque vous avez une phrase de 356 lignes avec plusieurs sous-phrases et que vous devez changer la logique de gauche à droite, vous vous demanderez de la changer avec un seul mot ...
Programador Adagal

1014

Codeproject a cette image qui explique les bases simples des jointures SQL, tirée de: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx Explication des jointures SQL


64
Il n'y a pas beaucoup de «détails» là-dedans. Le crédit devrait en fait aller à la page du projet de code plutôt qu'à moi. Mais bien sûr, cela ne me dérange pas l'attention :-)
Daan Timmer

6
@Daan Timmer non, il faut aussi vous en faire crédit! Vous reconditionnez et revendez pour répondre à une demande spécifique et particulière. Les détaillants font de même et obtiennent des milliards de dollars
BKSpurgeon

Je pense que nous pouvons exiger la condition "AND" dans la clause where de la dernière figure de "Outer Excluding JOIN". Je pense que la requête doit être mise à jour pour sélectionner <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key O A. A.Key EST NULL ET B.Key EST NULL
vinsinraw

@vinsinraw qui n'est pas nécessaire. Parce que ce qui est déjà couvert par la condition: JOIN Table_B b ON A.Key = B.Key. La condition OU fonctionne très bien.
Daan Timmer

Il s'agit d'un abus courant des diagrammes de Venn. Les cercles A et B ne représentent pas les tableaux A et B, le cercle A est A GAUCHE JOINDRE B & cirlce B est A DROITE JOINDRE également. Peu importe la condition ON et les touches ne sont pas pertinentes & OERE ne fonctionnent pas tous Cas. Voir mes commentaires et réponses sur cette page et cette section sur les diagrammes de Venn .
philipxy

37

Le tableau à partir duquel vous prenez des données est «GAUCHE».
La table que vous rejoignez est «DROITE».
JOINT GAUCHE: Prenez tous les éléments du tableau de gauche ET (uniquement) les éléments correspondants du tableau de droite.
JOINT DROIT: Prenez tous les éléments du tableau de droite ET (uniquement) les éléments correspondants du tableau de gauche.
Alors:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

donne:

Id     Name       
-------------  
1      A          
2      B      

mais:

Select * from Table1 right join Table2 on Table1.id = Table2.id

donne:

Id     Name       
-------------  
1      A          
2      B   
3      C  

vous avez rejoint la table à droite avec moins de lignes sur la table avec plus de lignes
ET
encore une fois, vous avez rejoint la table à gauche avec moins de lignes sur la table avec plus de lignes
Essayez:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

22

(INNER) JOIN: renvoie les enregistrements qui ont des valeurs correspondantes dans les deux tables.

LEFT (OUTER) JOIN: Renvoie tous les enregistrements de la table de gauche et les enregistrements correspondants de la table de droite.

RIGHT (OUTER) JOIN: renvoie tous les enregistrements de la table de droite et les enregistrements correspondants de la table de gauche.

FULL (OUTER) JOIN: renvoie tous les enregistrements en cas de correspondance dans le tableau de gauche ou de droite

Par exemple, supposons que nous ayons deux tables avec les enregistrements suivants:

Tableau A

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

Tableau B

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

Jointure interne

Remarque: Il donne l'intersection de deux tables.

Jointure interne

Syntaxe

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Appliquez-le dans votre exemple de table:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

Le résultat sera:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Joint gauche

Remarque: donnera toutes les lignes sélectionnées dans le tableau A, plus toutes les lignes sélectionnées courantes dans le tableauB.

Joint gauche

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Appliquez-le dans votre exemple de table

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

Le résultat sera:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Jointure droite

Remarque: donnera toutes les lignes sélectionnées dans le tableau B, plus toutes les lignes sélectionnées courantes dans le tableauA.

Jointure droite

Syntaxe:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Appliquez-le dans votre table samole:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

Le résultat sera bw:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Jointure complète

Remarque: C'est la même chose que l'opération d'union, elle renverra toutes les valeurs sélectionnées des deux tables.

Jointure complète

Syntaxe:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Appliquez-le dans votre samp [le tableau:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

Le résultat sera:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Quelques faits

Pour INNER rejoint la commande n'a pas d'importance

Pour les jointures (GAUCHE, DROITE ou COMPLÈTE) EXTÉRIEURES, l'ordre importe

En savoir plus sur w3schools


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

Le tableau dans le fromdans cet exemple tableA, est sur le côté gauche de la relation.

tableA <- tableB
[left]------[right]

Donc, si vous voulez prendre toutes les lignes de la table de gauche ( tableA), même s'il n'y a pas de correspondance dans la table de droite ( tableB), vous utiliserez la "jointure gauche".

Et si vous voulez prendre toutes les lignes de la table de droite ( tableB), même s'il n'y a pas de correspondance dans la table de gauche (tableA ), vous utiliserez le right join.

Ainsi, la requête suivante est équivalente à celle utilisée ci-dessus.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

Vous semblez demander: "Si je peux réécrire une syntaxe d' RIGHT OUTER JOINutilisation, LEFT OUTER JOINalors pourquoi avoir une RIGHT OUTER JOINsyntaxe?" Je pense que la réponse à cette question est, parce que les concepteurs du langage ne voulaient pas imposer une telle restriction aux utilisateurs (et je pense qu'ils auraient été critiqués s'ils l'avaient fait), ce qui obligerait les utilisateurs à changer l'ordre des tableaux dans la FROMclause dans certaines circonstances lorsque vous modifiez simplement le type de jointure.


parfois les jointures externes gauche et droite sont complètement interchangeables, n'est-ce pas?

4
@Alex: en effet, les jointures externes gauche et droite sont toujours interchangeables.
onedaywhen

8

Vos deux déclarations sont équivalentes.

La plupart des gens l'utilisent uniquement LEFT JOINcar cela semble plus intuitif et sa syntaxe universelle - je ne pense pas que tout le support SGBDR RIGHT JOIN.


"Je ne pense pas que tous les SGBDR prennent en charge RIGHT JOIN" - bien sûr, tous les SGBDR ne prennent pas en charge SQL. Mais si vous sous-entendez que certains produits SQL prennent en charge LEFTmais pas, RIGHTveuillez indiquer lesquels.
onedaywhen

10
@onedaywhen Par exemple, SQLite 3 n'implémente pas RIGHTet FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13

0

Je pense que nous pouvons exiger une ANDcondition dans la whereclause du dernier chiffre de Outer Excluding JOINsorte que nous obtenions le résultat souhaité A Union B Minus A Interaction B. Je pense que la requête doit être mise à jour pour

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

Si nous utilisons OR, nous obtiendrons tous les résultats deA Union B


0

sélectionnez * dans le tableau 1, joignez à gauche le tableau 2 sur le tableau1.id = tableau2.id

Dans la première requête, la jointure gauche compare la table gauche table table1 à la table droite table table2 .

Dans lequel toutes les propriétés de table1 seront affichées, tandis que dans table2 seules ces propriétés seront affichées dans quelle condition se vérifie.

sélectionnez * dans le tableau 2, joignez à droite le tableau 1 sur le tableau1.id = tableau2.id

Dans la première requête, la jointure droite compare la table droite1 table table à gauche table table2 .

Dans lequel toutes les propriétés de table1 seront affichées, tandis que dans table2 seules ces propriétés seront affichées dans quelle condition se vérifie.

Les deux requêtes donneront le même résultat car l'ordre de déclaration de table dans la requête est différent comme vous déclarez table1 et table2 respectivement à gauche et à droite dans la première requête de jointure gauche , et déclarez également table1 et table2 à droite et à gauche respectivement dans la deuxième jointure droite requete.

C'est la raison pour laquelle vous obtenez le même résultat dans les deux requêtes. Donc, si vous voulez un résultat différent, exécutez respectivement ces deux requêtes,

sélectionnez * dans le tableau 1, joignez à gauche le tableau 2 sur le tableau1.id = tableau2.id

sélectionnez * dans le tableau 1, joignez à droite le tableau 2 sur le tableau1.id = tableau2.id


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Par définition: Left Join sélectionne toutes les colonnes mentionnées avec le mot clé "select" du tableau 1 et les colonnes du tableau 2 qui correspondent aux critères après le mot clé "on".

De même, Par définition: Right Join sélectionne toutes les colonnes mentionnées avec le mot-clé "select" du tableau 2 et les colonnes du tableau 1 qui correspondent aux critères après le mot-clé "on".

En se référant à votre question, les identifiants dans les deux tableaux sont comparés à toutes les colonnes nécessaires pour être jetées dans la sortie. Ainsi, les identifiants 1 et 2 sont communs dans les deux tables et, par conséquent, dans le résultat, vous aurez quatre colonnes avec les colonnes id et name des première et deuxième tables dans l'ordre.

*select * from Table1 left join Table2 on Table1.id = Table2.id

L'expression ci-dessus, elle prend tous les enregistrements (lignes) du tableau 1 et des colonnes, avec les identifiants correspondants du tableau 1 et du tableau 2, du tableau 2.

select * from Table2 right join Table1 on Table1.id = Table2.id**

De même, à partir de l'expression ci-dessus, il prend tous les enregistrements (lignes) du tableau 1 et des colonnes, avec les identifiants correspondants des tableaux 1 et 2, du tableau 2. (rappelez-vous, il s'agit d'une jointure droite, donc toutes les colonnes du tableau2 et non du tableau 1 sera considéré).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.