JOIN SINISTRO vs. JOIN ESTERNO SINISTRO in SQL Server


1595

Qual è la differenza tra LEFT JOINe LEFT OUTER JOIN?


213
Nessuna! La OUTERparola chiave è facoltativa
Jarlh,

9
I diagrammi di Venn non sono appropriati per le risposte a questa domanda. La risposta a questa domanda è Nessuna . Vedi il primo commento
philipxy

3
I diagrammi di Venn illustrano la differenza nelle righe di output per casi speciali di join interno vs esterno . Se non vengono inseriti valori nulli o righe duplicate (in modo da poter prendere una tabella come un insieme di valori con valori di riga e utilizzare la normale uguaglianza matematica), i cerchi sinistro e destro contengono tabelle / set di output di sinistra e destra . Ma se vengono inseriti valori nulli o righe duplicate, è così difficile spiegare in cosa consistono i cerchi e in che modo tali gruppi si relazionano con le tabelle di input / output / sacchetti che i diagrammi di Venn non sono utili. Vedi i miei commenti qui su altri abusi del diagramma di Venn.
philipxy

Risposte:


2237

Secondo la documentazione: FROM (Transact-SQL) :

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

La parola chiave OUTERè contrassegnata come facoltativa (racchiusa tra parentesi quadre). In questo caso specifico, se si specifica OUTERo meno non fa alcuna differenza. Si noti che mentre gli altri elementi del join clausola è anche contrassegnato come optional, lasciando li fuori farà fare la differenza.

Ad esempio, l'intera parte del tipo della JOINclausola è facoltativa, nel qual caso l'impostazione predefinita è INNERse si specifica semplicemente JOIN. In altre parole, questo è legale:

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

Ecco un elenco di sintassi equivalenti:

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

Dai anche un'occhiata alla risposta che ho lasciato su quest'altra domanda SO: SQL lasciato join vs più tabelle sulla linea FROM? .

inserisci qui la descrizione dell'immagine


135
Assolutamente corretto. OUTER è consentito per la compatibilità ANSI-92.
Sean Reilly,

11
@ LasseV.Karlsen non sarebbe meglio avere INNER JOINa destra e proprio JOINa sinistra nell'elenco di equivalenti?
nawfal,

8
@ LasseV.Karlsen Volevo solo dire che il lato sinistro ha la forma concisa e il lato destro ha la forma espansa. Ho pensato che sarebbe stato coerente se avessi seguito lo stesso anche per JOINs.
nawfal,

30
Questa è la tua prerogativa, ma chiaramente altre 451 persone hanno pensato che la risposta fosse buona. Ad essere onesti, se una risposta dice X e un'altra risposta dice X e fa riferimento alla documentazione, oltre a copiare i pezzi rilevanti della documentazione nella risposta, il mio voto va alla seconda risposta ed è per questo che scrivo le mie risposte nel modo Lo voglio. Che qualcuno afferma che X non è buono. Se puoi provare X, è meglio (non alla leggera risposta di Sactiw). Ma è una tua prerogativa di pensare quello che vuoi. Mi chiedo perché pensi che sia inutile, la risposta è sbagliata in qualche modo?
Lasse V. Karlsen,

7
@Outlier E a dire il vero, se non hai voglia di leggere le mie "lunghe" risposte, allora la mia risposta non era per te. È per tutti gli altri che vengono qui a chiedersi la stessa cosa e vogliono un po 'di informazioni sul perché sia ​​così e dove trovare maggiori informazioni, ecc. Chiaramente tu sei il tipo di ragazzo che vorrebbe questa risposta: "Nessuno", ma sfortunatamente questo non è una risposta legale qui su Stack Overflow, né dovrebbe esserlo.
Lasse V. Karlsen,

700

Per rispondere alla tua domanda non c'è differenza tra LEFT JOIN e LEFT OUTER JOIN, sono esattamente gli stessi che dicevano ...

Al livello superiore ci sono principalmente 3 tipi di join:

  1. INTERNO
  2. ESTERNO
  3. ATTRAVERSARE

  1. INNER JOIN : recupera i dati se presenti in entrambe le tabelle.

  2. I JOU ESTERNI sono di 3 tipi:

    1. LEFT OUTER JOIN - recupera i dati se presenti nella tabella di sinistra.
    2. RIGHT OUTER JOIN - recupera i dati se presenti nella tabella giusta.
    3. FULL OUTER JOIN - recupera i dati se presenti in una delle due tabelle.
  3. CROSS JOIN , come suggerisce il nome, fa [n X m]che unisce tutto a tutto.
    Simile allo scenario in cui elenciamo semplicemente le tabelle per l'unione (nella FROMclausola SELECTdell'istruzione), usando le virgole per separarle.


Punti da notare:

  • Se hai appena citato, JOINper impostazione predefinita è a INNER JOIN.
  • Un OUTERjoin deve essere LEFT| RIGHT| FULLnon puoi semplicemente dire OUTER JOIN.
  • Puoi eliminare la OUTERparola chiave e semplicemente dire LEFT JOINo RIGHT JOINo FULL JOIN.

Per coloro che desiderano visualizzarli in modo migliore, visitare questo link: Una spiegazione visiva dei join SQL


17
Ottima risposta Sarà più chiaro se dici "LEFT OUTER JOIN - recupera tutti i dati dalla tabella di sinistra con i dati corrispondenti da destra, se preimpostati". per 2.1 (e modifiche simili per 2.2)
ssh,

1
Inoltre puoi eseguire il cross join semplicemente "seleziona * da Tabella A, Tabella B"
om471987

3
Scusate se sto necrobumping, ma è CROSS JOINlo stesso di FULL JOIN?
TechnicalTophat,

9
@RhysO no, CROSS JOIN è un prodotto cartesiano, ovvero CROSS JOIN di una tabella, con n righe, con una tabella, con m righe, darà sempre (n * m) righe mentre FULL OUTER JOIN di una tabella, con n righe, con una tabella, con m righe, fornirà al massimo (n + m) righe
sactiw

1
@sactiw considera di aggiungere una nota speciale nella tua preziosa risposta sulla differenza tra Cross Joine Full Outer Join... in qualche modo sembra simile.
Manuel Jordan,

356

Qual è la differenza tra join sinistro e join esterno sinistro?

Niente . LEFT JOINe LEFT OUTER JOINsono equivalenti.


13
ciao ciao! chi l'ha votata? LEFT JOIN è uguale a LEFT OUTER JOIN.
Mitch Wheat,

7
Questo è il caso di Microsoft SQL Server e di qualsiasi altro RDBMS conforme a SQL.
Bill Karwin,

7
Sarebbe bello se hai aggiunto un riferimento o una spiegazione sul perché l' OUTERopzione è facoltativa.
Zero3,

7
La risposta più concisa e accurata qui.
Manachi,

4
Grazie. La risposta accettata aveva troppe informazioni che mi lasciavano più confuso. Questo è esattamente quello che dovevo sapere e rispondere alla domanda originale direttamente al punto.
Bacon Brad,

66

Sono un DBA PostgreSQL, per quanto ho potuto capire la differenza tra la differenza dei join esterni o esterni è un argomento che ha una discussione considerevole su Internet. Fino ad oggi non ho mai visto una differenza tra quei due; Quindi sono andato oltre e provo a trovare la differenza tra quelli. Alla fine ho letto tutta la documentazione a riguardo e ho trovato la risposta per questo,

Quindi se guardi la documentazione (almeno in PostgreSQL) puoi trovare questa frase:

"Le parole INNERe OUTERsono opzionali in tutte le forme. INNERÈ il default, LEFT, RIGHT, e FULLimplicano un outer join".

In altre parole,

LEFT JOINe LEFT OUTER JOINSONO LO STESSO

RIGHT JOINe RIGHT OUTER JOINSONO LO STESSO

Spero che possa essere un contributo per coloro che stanno ancora cercando di trovare la risposta.


60

Left Joine Left Outer Joinsono la stessa cosa . Il primo è la scorciatoia per il secondo. Lo stesso si può dire della relazione Right Joine Right Outer Join. La dimostrazione illustrerà l'uguaglianza. Esempi di lavoro di ciascuna query sono stati forniti tramite SQL Fiddle . Questo strumento consentirà di manipolare direttamente la query.

Dato

inserisci qui la descrizione dell'immagine

Join sinistro e Join esterno sinistro

inserisci qui la descrizione dell'immagine

risultati

inserisci qui la descrizione dell'immagine


Unione destra e Unione esterna destra

inserisci qui la descrizione dell'immagine

risultati

inserisci qui la descrizione dell'immagine


43

Trovo più facile pensare a Joins nel seguente ordine:

  • CROSS JOIN - un prodotto cartesiano di entrambe le tabelle. TUTTI i join iniziano qui
  • INNER JOIN - un CROSS JOIN con un filtro aggiunto.
  • OUTER JOIN - un INNER JOIN con elementi mancanti (dalla tabella SINISTRA o DESTRA) aggiunti successivamente.

Fino a quando non ho capito questo modello (relativamente) semplice, JOINS era sempre un po 'più di un'arte nera. Ora hanno perfettamente senso.

Spero che questo aiuti più di quanto confonda.


Questo non risponde alla domanda.
philipxy,

33

Perché LEFT / RIGHT e LEFT OUTER / RIGHT OUTER sono uguali? Spieghiamo perché questo vocabolario. Comprendere che i join SINISTRA e DESTRA sono casi specifici del join ESTERNO, e quindi non potrebbero essere altro che ESTERNO SINISTRA / ESTERNO DESTRA. Il join OUTER è anche chiamato FULL OUTER anziché i join LEFT e RIGHT che sono i risultati PARZIALI del join OUTER. Infatti:

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)

Ora è chiaro perché tali operazioni hanno alias, così come è chiaro che esistono solo 3 casi: INTERNO, ESTERNO, CROSS. Con due sotto-casi per ESTERNO. Il vocabolario, il modo in cui gli insegnanti lo spiegano, così come alcune risposte sopra, spesso fanno sembrare che ci siano molti tipi diversi di join. Ma in realtà è molto semplice.


1
"è chiaro che esistono solo 3 casi": interessante ma imperfetto. Si consideri che un join interno è un cross join specializzato (ovvero sposta i predicati del join nella clausola where). Inoltre, considera che il join esterno non è affatto un join, ma piuttosto un sindacato in cui vengono utilizzati valori null al posto delle colonne "mancanti". Pertanto, si potrebbe sostenere che cross è l'unico join richiesto. Nota l'attuale pensiero nella teoria relazionale è che il join naturale soddisfa tutti i requisiti del join. A parte: puoi spiegare se / in che modo il vocabolario " JOINimplica INNER JOIN" si adatta al tuo ragionamento per il vocabolario di join esterno?
Onedayquando il

27

Per rispondere alla tua domanda

In SQL Server si unisce la sintassi OUTER è facoltativa

È menzionato nell'articolo di msdn: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Quindi il seguente elenco mostra sintassi equivalenti di join con e senza OUTER

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

Altre sintassi equivalenti

INNER JOIN => JOIN
CROSS JOIN => ,

Consiglio vivamente Dotnet Mob Artice: si unisce al server SQL inserisci qui la descrizione dell'immagine


2
Riutilizzo dei diagrammi di Venn qui vedi il mio commento sulla domanda.
Philipxy,

20

Ci sono solo 3 join:

  • A) Incrocio incrociato = cartesiano (ad esempio: tabella A, tabella B)
  • B) Join interno = JOIN (ad es. Tabella A Join / Inner Join tabella B)
  • C) Join esterno:

       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    

Spero possa essere d'aiuto.


1
Quindi 5 si uniscono del tutto.
Zeek2,

19

Esistono principalmente tre tipi di JOIN

  1. Interno: recupera i dati presenti in entrambe le tabelle
    • Solo JOIN significa INNER JOIN
  2. Esterno: sono di tre tipi

    • ESTERNO SINISTRA - - recupera i dati presenti solo nella tabella a sinistra e nelle condizioni corrispondenti
    • ESTERNO DESTRA - - recupera i dati presenti solo nella tabella corretta e nelle condizioni corrispondenti
    • ESTERNO COMPLETO - - recupera i dati presenti in una o entrambe le tabelle
    • (SINISTRA o DESTRA o COMPLETO) OUTER JOIN può essere scritto senza scrivere "OUTER"
  3. Cross Join: unisce tutto a tutto


16

Lo zucchero sintattico, rende più ovvio per il lettore occasionale che l'unione non è interiore.


2
Allora ... cos'è un JOU COMPLETO ESTERNO allora?
Amy B,

5
tableA FULL OUTER JOIN tableB ti fornirà tre tipi di record: tutti i record nella tabella A senza record corrispondenti nella tabella B, tutti i record nella tabella B senza record corrispondenti nella tabella A e tutti i record nella tabella A con un record corrispondente nella tabella B.
Dave DuPlantis,

4

Proprio nel contesto di questa domanda, voglio pubblicare anche i 2 operatori "APPLICA":

ISCRIVITI :

  1. INNER JOIN = JOIN

  2. ISCRIVITI ESTERNO

    • LEFT OUTER JOIN = LEFT JOIN

    • GIUSTO ESTERNO UNISCI = DESTRA UNISCITI

    • FULL OUTER JOIN = FULL JOIN

  3. CROSS JOIN

SELF-JOIN : Questo non è esattamente un tipo separato di join. Fondamentalmente si tratta di unire una tabella a se stessa utilizzando uno dei join precedenti. Ma ho sentito che vale la pena menzionare nel contesto delle discussioni JOIN poiché sentirai questo termine da molti nella comunità degli sviluppatori SQL.

APPLICARE :

  1. CROSS APPLY - Simile a INNER JOIN (Ma ha aggiunto il vantaggio di poter calcolare qualcosa nella tabella di destra per ogni riga della tabella di sinistra e restituirebbe solo le righe corrispondenti)
  2. OUTER APPLY - Simile a LEFT OUTER JOIN (Ma ha aggiunto il vantaggio di poter calcolare qualcosa nella tabella di destra per ogni riga della tabella di sinistra e restituirebbe tutte le righe della tabella di sinistra indipendentemente da una corrispondenza nella tabella di destra)

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

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

Esempio di vita reale, quando utilizzare OUTER / CROSS APPLY in SQL

Trovo l'operatore APPLY molto utile in quanto offrono prestazioni migliori rispetto a dover eseguire lo stesso calcolo in una subquery. Sostituiscono inoltre molte funzioni analitiche nelle versioni precedenti di SQL Server. Questo è il motivo per cui credo che dopo essersi sentito a mio agio con JOINS, uno sviluppatore SQL dovrebbe provare ad apprendere successivamente gli operatori APPLY.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.