Qual è la differenza tra i join sinistro, destro, esterno e interno?


562

Mi chiedo come differenziare tutti questi diversi join ...



3
Dipende anche dal tuo livello di comprensione, per qualcuno come te quell'articolo non fa altro che per qualcuno che forse non capisce completamente le
iscrizioni

6
Questo è un duplicato di stackoverflow.com/questions/419375/sql-join-differences e senza dubbio altri ...
cletus,

1
Questo mi ha aiutato molto ... il modo più semplice è creare tavoli di prova e giocare con loro. = P
daGrevis,

Risposte:


797

Esempio semplice : supponiamo che tu abbia una Studentstabella e una Lockerstabella. In SQL, la prima tabella specificata in un join Students, è la tabella SINISTRA e la seconda Lockers, è DESTRA tabella .

Ogni studente può essere assegnato a un armadietto, quindi c'è una LockerNumbercolonna nelStudent tabella. Più di uno studente potrebbe essere potenzialmente in un unico armadietto, ma soprattutto all'inizio dell'anno scolastico, potresti avere alcuni studenti in arrivo senza armadietti e alcuni armadietti che non hanno studenti assegnati.

Per il bene di questo esempio, supponiamo che tu abbia 100 studenti , 70 dei quali hanno armadietti. Hai un totale di 50 armadietti , 40 dei quali hanno almeno 1 studente e 10 armadietti non hanno studenti.

INNER JOIN equivale a " mostrami tutti gli studenti con armadietti ".
Mancano studenti senza armadietti o armadietti senza studenti.
Restituisce 70 righe

LEFT OUTER JOIN sarebbe " mostrami tutti gli studenti, con il loro armadietto corrispondente se ne hanno uno ".
Questo potrebbe essere un elenco di studenti generale o potrebbe essere utilizzato per identificare gli studenti senza armadietto.
Restituisce 100 righe

GIUSTO ESTERNO UNISCITI sarebbe " mostrami tutti gli armadietti e gli studenti assegnati loro se ce ne sono ".
Questo potrebbe essere usato per identificare gli armadietti a cui non sono stati assegnati studenti o gli armadietti che hanno troppi studenti.
Restituisce 80 righe (elenco di 70 studenti nei 40 armadietti, più i 10 armadietti senza studente)

FULL OUTER JOIN sarebbe sciocco e probabilmente non molto utile.
Qualcosa del tipo " mostrami tutti gli studenti e tutti gli armadietti e abbinali dove puoi "
Restituisce 110 righe (tutti i 100 studenti, compresi quelli senza armadietti. Inoltre i 10 armadietti senza studente)

CROSS JOIN è anche abbastanza sciocco in questo scenario.
Non utilizza il lockernumbercampo collegato nella tabella degli studenti, quindi fondamentalmente si finisce con un grande elenco gigante di ogni possibile accoppiamento studente-armadietto, indipendentemente dal fatto che esista effettivamente.
Restituisce 5000 righe (100 studenti x 50 armadietti). Potrebbe essere utile (con filtro) come punto di partenza per abbinare i nuovi studenti con gli armadietti vuoti.


12
Utilizzando il tuo esempio, il CROSS join sarebbe utile come punto di partenza per la creazione di assegnazioni di armadietti: inizia con tutte le possibili combinazioni e quindi utilizza altri criteri per filtrare i risultati dall'elenco.
Joel Coehoorn,

1
Bella risposta. Credo che il Cross Join sia spesso utilizzato per generare dati di test da poche righe quando è necessario un numero elevato di record.
Eli,

6
FULL OUTER JOINS può essere utile durante la ricerca di dati orfani o quando si confrontano versioni diverse dello stesso set di dati.
Lara Dougan,

3
Cross join aka prodotto cartesiano
JavaRocky

3
Penso che il modo in cui inizi la tua query influisca sul risultato del tipo di join. Ad esempio, SELECT * FROM students RIGHT OUTER JOIN lockers...si tradurrebbe in un risultato diverso rispetto a SELECT * FROM lockers RIGHT OUTER JOIN students.... Ottima risposta, ma mi piacerebbe vederlo aggiornato con SQLquery complete
jbmilgrom,

141

Esistono tre tipi base di join:

  • INNERjoin confronta due tabelle e restituisce risultati solo dove esiste una corrispondenza. I record della 1a tabella vengono duplicati quando corrispondono a risultati multipli nella 2a. I join INNER tendono a ridurre le serie di risultati, ma poiché i record possono essere duplicati, ciò non è garantito.
  • CROSSjoin confronta due tabelle e restituisce ogni possibile combinazione di righe da entrambe le tabelle. È possibile ottenere molti risultati da questo tipo di join che potrebbero non essere significativi, quindi utilizzare con cautela.
  • OUTERjoin confronta due tabelle e restituisce dati quando è disponibile una corrispondenza o valori NULL in caso contrario. Come con il join INNER, questo duplicherà le righe in una tabella quando corrisponde a più record nell'altra tabella. I join ESTERNI tendono ad ampliare i set di risultati, poiché non rimuoveranno da soli alcun record dal set. È inoltre necessario qualificare un join OUTER per determinare quando e dove aggiungere i valori NULL:
    • LEFT significa mantenere tutti i record della 1a tabella, non importa quale e inserire valori NULL quando la 2a tabella non corrisponde.
    • RIGHT significa il contrario: mantenere tutti i record della seconda tabella, non importa cosa, e inserire i valori NULL quando la prima tabella non corrisponde.
    • FULL significa mantenere tutti i record da entrambe le tabelle e inserire un valore NULL in entrambe le tabelle se non vi è corrispondenza.

Spesso vedi la OUTERparola chiave omessa dalla sintassi. Invece sarà solo "LEFT JOIN", "RIGHT JOIN" o "FULL JOIN". Questo viene fatto perché i join INNER e CROSS non hanno alcun significato rispetto a LEFT, RIGHT o FULL, e quindi questi sono sufficienti da soli per indicare inequivocabilmente un join OUTER.

Ecco un esempio di quando potresti voler usare ogni tipo:

  • INNER: Si desidera restituire tutti i record dalla tabella "Invoice", insieme alle "InvoiceLines" corrispondenti. Ciò presuppone che ogni fattura valida disponga di almeno una riga.
  • OUTER: Si desidera restituire tutti i record "InvoiceLines" per una fattura particolare, insieme ai corrispondenti record "InventoryItem". Si tratta di un'azienda che vende anche servizi, in modo tale che non tutti InvoiceLines disporranno di un IventoryItem.
  • CROSS: Hai una tabella di cifre con 10 righe, ognuna con valori compresi tra "0" e "9". Si desidera creare una tabella degli intervalli di date a cui unirsi, in modo da finire con un record per ogni giorno all'interno dell'intervallo. Unendo CROSS a questa tabella ripetutamente con se stesso, puoi creare tutti gli interi consecutivi di cui hai bisogno (dato che inizi dalla 10 alla 1a potenza, ogni join aggiunge 1 all'esponente). Quindi utilizzare la funzione DATEADD () per aggiungere quei valori alla data di base per l'intervallo.

1
Bello. Aggiungo che di solito se scrivi solo 'JOIN' significa INNER JOIN.
matpop,

47

Esistono solo 4 tipi:

  1. Join interno : il tipo più comune. Viene prodotta una riga di output per ogni coppia di righe di input che corrispondono alle condizioni di join.
  2. Join esterno sinistro : uguale a un join interno, tranne per il fatto che se esiste una riga per la quale non è possibile trovare una riga corrispondente nella tabella a destra, viene generata una riga contenente i valori della tabella a sinistra, con NULLper ogni valore nella tabella a destra. Ciò significa che ogni riga della tabella a sinistra apparirà almeno una volta nell'output.
  3. Unione esterna destra : uguale a un join esterno sinistro, tranne che con i ruoli delle tabelle invertiti.
  4. Join esterno completo : una combinazione di join esterni sinistro e destro. Ogni riga di entrambe le tabelle verrà visualizzata nell'output almeno una volta.

Una "unione incrociata" o "unione cartesiana" è semplicemente un'unione interna per la quale non sono state specificate condizioni di unione, risultando in tutte le coppie di righe in uscita.

Grazie a RusselH per aver segnalato i join FULL, che avevo omesso.


1
che dire del full outer join e cross join (prodotto cartesiano)?
SQLMenace,

full è in realtà l'equivalente di due join esterni
RussellH,

25
FULL è quello che ottieni quando rovini il tuo join interno, e poi fai una domanda qui "perché ricevo N ^ 2 righe invece di N"? Allora tutti ti prendono CROSS.
Paul Tomblin,

24

Differenza JOIN SQL:

Molto semplice da ricordare:

INNER JOIN mostra solo i record comuni ad entrambe le tabelle.

OUTER JOIN tutto il contenuto di entrambe le tabelle viene unito o abbinato o meno.

LEFT JOIN è lo stesso di LEFT OUTER JOIN - (Seleziona i record dalla prima tabella (più a sinistra) con i record della tabella di destra corrispondenti.)

RIGHT JOINè uguale a RIGHT OUTER JOIN- (Seleziona i record dalla seconda tabella (più a destra) con i corrispondenti record della tabella di sinistra.)

inserisci qui la descrizione dell'immagine


C'è un modo corretto e pertinente per etichettare i cerchi del diagramma di Venn, ma non è così. I cerchi non sono le tabelle di input. Inoltre le righe dei risultati non sono righe di input, quindi la tua descrizione è errata lì. Anche questo non è chiaro: non spieghi "comune a entrambi", "abbinato", "unito".
philipxy,

9

Dai un'occhiata a Join (SQL) su Wikipedia

  • Join interno: date due tabelle, un join interno restituisce tutte le righe esistenti in entrambe le tabelle
  • join sinistro / destro (esterno): date due tabelle restituisce tutte le righe presenti nella tabella sinistra o destra del join, più le righe dall'altro lato verranno restituite quando la clausola join è una corrispondenza o verrà restituito null per quelle colonne

  • Esterno completo: date due tabelle restituisce tutte le righe e restituisce valori null quando la colonna sinistra o destra non è presente

  • Join incrociati: join cartesiani e possono essere pericolosi se non utilizzati con attenzione


6

Renderlo più visibile potrebbe aiutare. Un esempio:

Tabella 1:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

Tavolo 2:

ID_STUDENT LOCKER

3               l1
4               l2
5               l3

Cosa ottengo quando lo faccio:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

4

LEFT JOINe RIGHT JOINsono tipi di OUTER JOINs.

INNER JOIN è l'impostazione predefinita: le righe di entrambe le tabelle devono corrispondere alla condizione di join.


5
Non riesco a credere come questa risposta abbia alcuni voti positivi e allo stesso tempo sia così incompleta.
nbro,

Penso che sia stata una risposta migliore alla domanda originale.
RussellH,

3

Join interno : mostra solo le righe, quando contiene i dati di entrambe le tabelle.

Join esterno : (sinistra / destra) : Mostra il tutto seguito da sinistra / destra tabella con le righe abbinato ( s ), se esiste o no.


2

All'inizio devi capire cosa fa Join? Colleghiamo più tabelle e otteniamo risultati specifici dalle tabelle unite. Il modo più semplice per farlo è il cross join .

Diciamo che la tabella A ha due colonne A e B. E la tabella B ha tre colonne C e D. Se applichiamo il cross join, si produrranno molte righe senza significato. Quindi dobbiamo abbinare usando la chiave primaria per ottenere dati reali.

Sinistra: restituirà tutti i record dalla tabella di sinistra e i record corrispondenti dalla tabella di destra.

Destra: tornerà di fronte al join di sinistra. Restituirà tutti i record dalla tabella di destra e i record corrispondenti dalla tabella di sinistra.

Interno: è come un incrocio. Restituirà solo i record corrispondenti da entrambe le tabelle.

Esterno: E questo è come l'unione. Restituirà tutto il record disponibile da entrambe le tabelle.

Alcune volte non abbiamo bisogno di tutti i dati e dovremmo anche solo bisogno di dati o record comuni. possiamo facilmente ottenerlo usando questi metodi di join. Ricorda anche i join destro e sinistro sono quelli esterni.

Puoi ottenere tutti i record semplicemente usando il cross join. Ma potrebbe essere costoso quando si tratta di milioni di dischi. Quindi rendilo semplice usando il join sinistro, destro, interno o esterno.

Grazie

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.