LEFT JOIN vs LEFT OUTER JOIN dans SQL Server


1595

Quelle est la difference entre LEFT JOINet LEFT OUTER JOIN?


213
Aucun! Le OUTERmot-clé est facultatif.
jarlh

9
Les diagrammes de Venn ne conviennent pas aux réponses à cette question. La réponse à cette question est Aucune . Voir le premier commentaire.
philipxy

3
Les diagrammes de Venn illustrent la différence dans les lignes de sortie pour les cas particuliers de jointure interne et externe . Si aucune valeur nulle ou ligne en double n'est entrée (afin que nous puissions prendre un tableau comme un ensemble de valeurs de ligne et utiliser l'égalité mathématique normale), les cercles gauche et droit contiennent les tableaux de sortie / ensembles de jointure gauche et droite . Mais si des valeurs nulles ou des lignes en double sont entrées, il est si difficile d'expliquer en quoi consistent les cercles et comment ces ensembles sont liés aux tables / sacs d'entrée et de sortie que les diagrammes de Venn ne sont pas utiles. Voir mes commentaires ici concernant d'autres abus du diagramme de Venn.
philipxy

Réponses:


2237

Selon la documentation: FROM (Transact-SQL) :

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Le mot OUTER- clé est marqué comme facultatif (entre crochets). Dans ce cas spécifique, que vous spécifiez OUTERou non ne fait aucune différence. Notez que tandis que les autres éléments de la clause join sont également marqués comme facultatifs, les laisser de côté fera une différence.

Par exemple, la partie type entière de la JOINclause est facultative, auquel cas la valeur par défaut est INNERsi vous spécifiez simplement JOIN. En d'autres termes, c'est légal:

SELECT *
FROM A JOIN B ON A.X = B.Y

Voici une liste de syntaxes équivalentes:

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

Jetez également un œil à la réponse que j'ai laissée sur cette autre question SO: SQL left join vs plusieurs tables sur la ligne FROM? .

entrez la description de l'image ici


135
Absolument correct. OUTER est autorisé pour la compatibilité ANSI-92.
Sean Reilly

11
@ LasseV.Karlsen ne vaudrait-il pas mieux avoir INNER JOINà droite et juste JOINà gauche dans la liste des équivalents?
nawfal

8
@ LasseV.Karlsen Je voulais juste dire que le côté gauche a la forme concise et le côté droit a la forme développée. Je pensais que ce serait cohérent si vous suiviez la même chose pour JOINs également.
nawfal

30
@Outlier C'est votre prérogative, mais clairement 451 autres personnes ont trouvé la bonne réponse. Pour être honnête, si une réponse dit X et une autre réponse dit X et fait référence à la documentation, ainsi que copier les éléments pertinents de la documentation dans la réponse, mon vote va à la deuxième réponse et c'est pourquoi j'écris mes réponses de la manière Je fais. Que quelqu'un prétend que X n'est pas bon. Si vous pouvez prouver X, c'est mieux (pas à la légère réponse de Sactiw). Mais, c'est votre prérogative de penser ce que vous voulez. Je me demande pourquoi vous pensez que c'est inutile cependant, la réponse est-elle mauvaise de quelque façon que ce soit?
Lasse V. Karlsen

7
@Outlier Et pour être honnête, si vous n'avez pas envie de lire mes "longues" réponses, alors ma réponse n'était pas pour vous. C'est pour tous ceux qui viennent ici se poser des questions sur la même chose et veulent avoir des informations sur pourquoi, et où trouver plus d'informations, etc. n'est pas une réponse légale ici sur Stack Overflow, ni ne devrait l'être.
Lasse V. Karlsen

700

Pour répondre à votre question, il n'y a pas de différence entre LEFT JOIN et LEFT OUTER JOIN, ils sont exactement les mêmes que ceux qui ont été dit ...

Au niveau supérieur, il existe principalement 3 types de jointures:

  1. INTERNE
  2. EXTÉRIEUR
  3. TRAVERSER

  1. INNER JOIN - récupère les données si elles sont présentes dans les deux tables.

  2. OUTER JOIN sont de 3 types:

    1. LEFT OUTER JOIN - récupère les données si elles sont présentes dans le tableau de gauche.
    2. RIGHT OUTER JOIN - récupère les données si elles sont présentes dans le tableau de droite.
    3. FULL OUTER JOIN - récupère les données si elles sont présentes dans l'un des deux tableaux.
  3. CROSS JOIN , comme son nom l'indique, fait [n X m]que tout se joint à tout.
    Similaire au scénario où nous listons simplement les tables à joindre (dans la FROMclause de l' SELECTinstruction), en utilisant des virgules pour les séparer.


Points à noter:

  • Si vous venez de mentionner, JOINpar défaut, c'est un INNER JOIN.
  • Une OUTERjointure doit être LEFT| RIGHT| FULLvous ne pouvez pas simplement dire OUTER JOIN.
  • Vous pouvez déposer un OUTERmot-clé et dire simplement LEFT JOINou RIGHT JOINou FULL JOIN.

Pour ceux qui souhaitent mieux les visualiser, veuillez consulter ce lien: Une explication visuelle des jointures SQL


17
Très bonne réponse. Il sera plus clair si vous dites "LEFT OUTER JOIN - récupère toutes les données du tableau de gauche avec les données correspondantes de droite, si prédéfinies." pour 2.1 (et changement similaire pour 2.2)
ssh

1
Vous pouvez également effectuer une jointure croisée en sélectionnant simplement * à partir de TableA, TableB '
om471987

3
Désolé si je necrobumping, mais est-ce CROSS JOINla même chose que FULL JOIN?
TechnicalTophat

9
@RhysO non, CROSS JOIN est un produit cartésien, c'est-à-dire CROSS JOIN d'une table, ayant n lignes, avec une table, ayant m lignes, donnera toujours (n * m) lignes tandis que FULL OUTER JOIN d'une table, ayant n lignes, avec une table, ayant m lignes, donnera au maximum (n + m) lignes
sactiw

1
@sactiw envisagez d'ajouter une note spéciale dans votre réponse précieuse sur la différence entre Cross Joinet Full Outer Join... semble en quelque sorte similaire.
Manuel Jordan

356

Quelle est la différence entre la jointure gauche et la jointure externe gauche?

Rien . LEFT JOINet LEFT OUTER JOINsont équivalents.


13
euh bonjour! qui a voté contre? LEFT JOIN est le même que LEFT OUTER JOIN.
Mitch Wheat

7
C'est le cas dans Microsoft SQL Server et dans tout autre SGBDR compatible SQL.
Bill Karwin

7
Ce serait bien si vous ajoutiez une référence ou une explication sur la raison pour laquelle l' OUTERoption est facultative.
Zero3

7
Réponse la plus concise et précise ici.
Manachi

4
Je vous remercie. La réponse acceptée contenait beaucoup trop d'informations qui me laissaient plus confus. C'est exactement ce que j'avais besoin de savoir et répond directement à la question d'origine.
Bacon Brad

66

Je suis un DBA PostgreSQL, pour autant que je puisse comprendre la différence entre les jointures externes ou non externes, la différence est un sujet qui a fait l'objet de nombreuses discussions sur Internet. Jusqu'à aujourd'hui, je n'ai jamais vu de différence entre ces deux; Je suis donc allé plus loin et j'essaie de trouver la différence entre ceux-ci. À la fin, j'ai lu toute la documentation à ce sujet et j'ai trouvé la réponse à cela,

Donc, si vous regardez la documentation (au moins dans PostgreSQL), vous pouvez trouver cette phrase:

« Les mots INNERet OUTERsont facultatifs sous toutes ses formes. INNEREst la valeur par défaut LEFT, RIGHTet FULLimpliquent une jointure externe. »

En d'autres mots,

LEFT JOINet sont les LEFT OUTER JOINmêmes

RIGHT JOINet sont les RIGHT OUTER JOINmêmes

J'espère que cela peut être une contribution pour ceux qui essaient encore de trouver la réponse.


60

Left Joinet Left Outer Joinsont une seule et même chose . Le premier est le raccourci pour le second. On peut en dire autant de la relation Right Joinet Right Outer Join. La démonstration illustrera l'égalité. Des exemples de travail de chaque requête ont été fournis via SQL Fiddle . Cet outil permettra une manipulation pratique de la requête.

Donné

entrez la description de l'image ici

Jointure gauche et jointure externe gauche

entrez la description de l'image ici

Résultats

entrez la description de l'image ici


Jointure droite et jointure droite externe

entrez la description de l'image ici

Résultats

entrez la description de l'image ici


43

Je trouve plus facile de penser aux jointures dans l'ordre suivant:

  • CROSS JOIN - un produit cartésien des deux tables. TOUTES les jointures commencent ici
  • INNER JOIN - un CROSS JOIN avec un filtre ajouté.
  • OUTER JOIN - un INNER JOIN avec des éléments manquants (de la table GAUCHE ou DROITE) ajouté par la suite.

Jusqu'à ce que je comprenne ce modèle (relativement) simple, JOINS était toujours un peu plus un art noir. Maintenant, ils ont un sens parfait.

J'espère que cela aide plus qu'il ne confond.


Cela ne répond pas à la question.
philipxy

33

Pourquoi LEFT / RIGHT et LEFT OUTER / RIGHT OUTER sont-ils les mêmes? Expliquons pourquoi ce vocabulaire. Comprenez que les jointures GAUCHE et DROITE sont des cas spécifiques de la jointure OUTER, et ne peuvent donc pas être autre chose que OUTER LEFT / OUTER RIGHT. La jointure OUTER est également appelée FULL OUTER par opposition aux jointures LEFT et RIGHT qui sont des résultats PARTIELS de la jointure OUTER. En effet:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

Il est maintenant clair pourquoi ces opérations ont des alias, et il est clair que seuls 3 cas existent: INNER, OUTER, CROSS. Avec deux sous-cas pour l'OUTER. Le vocabulaire, la façon dont les enseignants expliquent cela, ainsi que certaines réponses ci-dessus, donnent souvent l'impression qu'il existe de nombreux types de jointures. Mais c'est en fait très simple.


1
"il est clair qu'il n'existe que 3 cas": intéressant mais imparfait. Considérez qu'une jointure interne est une jointure croisée spécialisée (c'est-à-dire déplacer les prédicats de jointure vers la clause where). Considérez en outre que la jointure externe n'est pas du tout une jointure, mais plutôt une union où sont utilisés des valeurs nulles à la place des colonnes «manquantes». Par conséquent, on pourrait faire valoir que la croix est la seule jointure requise. Notez que la pensée actuelle dans la théorie relationnelle est que la jointure naturelle satisfait toutes les exigences de jointure. En plus: pouvez-vous expliquer si / comment le vocabulaire " JOINimplique INNER JOIN" correspond à votre raisonnement pour le vocabulaire des jointures externes?
onedaywhen

27

Pour répondre à ta question

Dans SQL Server, la syntaxe des jointures OUTER est facultative

Il est mentionné dans l'article msdn: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Donc, la liste suivante montre les syntaxes de jointure équivalentes avec et sans OUTER

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

Autres syntaxes équivalentes

INNER JOIN => JOIN
CROSS JOIN => ,

Je recommande vivement Dotnet Mob Artice: se joint au serveur SQL entrez la description de l'image ici


2
Re abus des diagrammes de Venn ici voir mon commentaire sur la question.
philipxy

20

Il n'y a que 3 jointures:

  • A) Jointure croisée = cartésienne (ex: tableau A, tableau B)
  • B) Jointure interne = JOIN (Par exemple: Table A Join / Inner Join Table B)
  • C) Jointure externe:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

J'espère que ça aiderait.


1
Donc 5 jointures au total.
Zeek2

19

Il existe principalement trois types de JOIN

  1. Inner: récupère les données présentes dans les deux tableaux
    • Only JOIN signifie INNER JOIN
  2. Extérieur: sont de trois types

    • LEFT OUTER - - récupère les données présentes uniquement dans le tableau de gauche et l'état correspondant
    • RIGHT OUTER - - récupère les données présentes uniquement dans le tableau de droite et les conditions correspondantes
    • FULL OUTER - - récupère les données présentes dans l'une ou les deux tables
    • (GAUCHE ou DROITE ou COMPLÈTE) OUTER JOIN peut être écrit sans écrire "OUTER"
  3. Cross Join: joint tout à tout


16

Le sucre syntaxique, rend plus évident pour le lecteur occasionnel que la jointure n'est pas intérieure.


2
Alors ... qu'est-ce qu'un FULL OUTER JOIN alors?
Amy B

5
tableA FULL OUTER JOIN tableB vous donnera trois types d'enregistrements: tous les enregistrements dans tableA sans enregistrement correspondant dans tableB, tous les enregistrements dans tableB sans enregistrement correspondant dans tableA et tous les enregistrements dans tableA avec un enregistrement correspondant dans tableB.
Dave DuPlantis

4

Dans le cadre de cette question, je souhaite également publier les 2 opérateurs 'APPLY':

SE JOINT :

  1. INNER JOIN = JOIN

  2. JOINT EXTERIEUR

    • LEFT OUTER JOIN = LEFT JOIN

    • RIGHT OUTER JOIN = RIGHT JOIN

    • FULL OUTER JOIN = FULL JOIN

  3. CROSS JOIN

SELF-JOIN : Ce n'est pas exactement un type de jointure distinct. Il s'agit essentiellement de joindre une table à elle-même en utilisant l'une des jointures ci-dessus. Mais j'ai pensé qu'il valait la peine d'être mentionné dans le contexte des discussions JOIN car vous entendrez ce terme de la part de nombreux développeurs SQL.

APPLIQUER :

  1. CROSS APPLY - Similaire à INNER JOIN (Mais a l'avantage supplémentaire de pouvoir calculer quelque chose dans la table de droite pour chaque ligne de la table de gauche et ne retournerait que les lignes correspondantes)
  2. OUTER APPLY - Similaire à LEFT OUTER JOIN (Mais a l'avantage supplémentaire de pouvoir calculer quelque chose dans la table de droite pour chaque ligne de la table de gauche et retournerait toutes les lignes de la table de gauche indépendamment d'une correspondance sur la table de droite)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

Exemple réel, quand utiliser OUTER / CROSS APPLY dans SQL

Je trouve que l'opérateur APPLY est très bénéfique car il donne de meilleures performances que d'avoir à faire le même calcul dans une sous-requête. Ils remplacent également de nombreuses fonctions analytiques dans les anciennes versions de SQL Server. C'est pourquoi je crois qu'après avoir été à l'aise avec JOINS, un développeur SQL devrait essayer d'apprendre les opérateurs APPLY ensuite.

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.