inner join vs outer join
Join interno vs join esterno: preparati ad esplorare le differenze esatte tra join interno ed esterno
Prima di esplorare le differenze tra Inner Join e Outer Join, vediamo prima cos'è un SQL JOIN?
Una clausola di join viene utilizzata per combinare i record o per manipolare i record di due o più tabelle tramite una condizione di join. La condizione di join indica come le colonne di ciascuna tabella vengono confrontate tra loro.
Join si basa su una colonna correlata tra queste tabelle. Un esempio più comune è l'unione tra due tabelle tramite la colonna della chiave primaria e la colonna della chiave esterna.
Supponiamo di avere una tabella che contiene lo stipendio dei dipendenti e un'altra tabella che contiene i dettagli dei dipendenti.
In questo caso, ci sarà una colonna comune come ID dipendente che unirà queste due tabelle. Questa colonna ID dipendente sarebbe la chiave primaria delle tabelle dei dettagli dei dipendenti e la chiave esterna nella tabella degli stipendi dei dipendenti.
È molto importante avere una chiave comune tra le due entità. Puoi pensare a una tabella come a un'entità e alla chiave come a un collegamento comune tra le due tabelle che viene utilizzato per l'operazione di unione.
da youtube a mp4 online gratis veloce
Fondamentalmente, ci sono due tipi di join in SQL, ad es. Join interno e join esterno . L'unione esterna è ulteriormente suddivisa in tre tipi, ad es. Join esterno sinistro, join esterno destro e join esterno completo.
In questo articolo, vedremo la differenza tra Join interno e join esterno in dettaglio. Manterremo i Cross Joins e Unequal Join fuori dallo scopo di questo articolo.
Cosa imparerai:
- Cos'è Inner Join?
- Cos'è Outer Join?
- Differenza tra unione interna ed esterna
- Prestazione
- MS Access Inner e Outer Join
- Join sinistro vs Join esterno sinistro
- Join esterno sinistro vs join esterno destro
- Differenza tra Inner Join e Outer Join in formato tabulare
- Unione interna ed esterna contro Unione
- Conclusione
- Lettura consigliata
Cos'è Inner Join?
Un Inner Join restituisce solo le righe che hanno valori corrispondenti in entrambe le tabelle (stiamo considerando che l'unione viene eseguita tra le due tabelle).
Cos'è Outer Join?
L'Outer Join include le righe corrispondenti così come alcune delle righe non corrispondenti tra le due tabelle. Un join esterno è sostanzialmente diverso dall'unione interna per il modo in cui gestisce la condizione di falsa corrispondenza.
Esistono 3 tipi di Outer Join:
- Join esterno sinistro : Restituisce tutte le righe della tabella SINISTRA e i record corrispondenti tra entrambe le tabelle.
- Right Outer Join : Restituisce tutte le righe della tabella DESTRA e i record corrispondenti tra entrambe le tabelle.
- Join esterno completo : Combina il risultato di Left Outer Join e Right Outer Join.
Differenza tra unione interna ed esterna
(Immagine fonte )
Come mostrato nel diagramma sopra, ci sono due entità cioè la tabella 1 e la tabella 2 ed entrambe le tabelle condividono alcuni dati comuni.
Un Inner Join restituirà l'area comune tra queste tabelle (l'area ombreggiata in verde nel diagramma sopra), ovvero tutti i record comuni tra la tabella 1 e la tabella 2.
Un join esterno sinistro restituirà tutte le righe della tabella 1 e solo quelle righe della tabella 2 che sono comuni anche alla tabella 1. Un Right Outer Join farà esattamente l'opposto. Fornirà tutti i record dalla tabella 2 e solo i record corrispondenti corrispondenti dalla tabella 1.
Inoltre, un Full Outer Join ci darà tutti i record dalla tabella 1 e dalla tabella 2.
Cominciamo con un esempio per renderlo più chiaro.
Supponiamo di averne due tabelle: EmpDetails ed EmpSalary .
Tabella EmpDetails:
ID Dipendente | Nome dipendente |
7 | Giglio |
1 | John |
Due | Samantha |
3 | Nessuna |
4 | Setoso |
5 | Ram |
6 | Arpit |
8 | Sita |
9 | Farah |
10 | Jerry |
Tabella EmpSalary:
ID Dipendente | Nome dipendente | EmployeeSalary |
---|---|---|
undici | Rosa | 90000 |
1 | John | 50.000 |
Due | Samantha | 120000 |
3 | Nessuna | 75000 |
4 | Setoso | 25000 |
5 | Ram | 150000 |
6 | Arpit | 80000 |
12 | Sakshi | 45000 |
13 | Jack | 250.000 |
Facciamo un Inner Join su queste due tabelle e osserviamo il risultato:
Query:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Risultato:
ID Dipendente | Nome dipendente | EmployeeSalary |
---|---|---|
7 | Giglio | NULLO |
1 | John | 50.000 |
Due | Samantha | 120000 |
3 | Nessuna | 75000 |
4 | Setoso | 25000 |
5 | Ram | 150000 |
6 | Arpit | 80000 |
Nel set di risultati sopra, puoi vedere che Inner Join ha restituito i primi 6 record che erano presenti sia in EmpDetails che in EmpSalary con una chiave corrispondente, ad esempio EmployeeID. Quindi, se A e B sono due entità, Inner Join restituirà il set di risultati che sarà uguale a 'Record in A e B', in base alla chiave di corrispondenza.
Vediamo ora cosa farà un Left Outer Join.
Query:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Risultato:
ID Dipendente | Nome dipendente | EmployeeSalary |
---|---|---|
1 | John | 50.000 |
Due | Samantha | 120000 |
3 | Nessuna | 75000 |
4 | Setoso | 25000 |
5 | Ram | 150000 |
6 | Arpit | 80000 |
8 | Sita | NULLO |
9 | Farah | NULLO |
10 | Jerry | NULLO |
Nel set di risultati sopra, puoi vedere che il join esterno sinistro ha restituito tutti i 10 record dalla tabella LEFT, ad esempio la tabella EmpDetails e poiché i primi 6 record corrispondono, ha restituito lo stipendio del dipendente per questi record corrispondenti.
Poiché il resto dei record non ha una chiave corrispondente nella tabella RIGHT, ovvero la tabella EmpSalary, ha restituito NULL corrispondente a quelli. Poiché Lily, Sita, Farah e Jerry non hanno un ID dipendente corrispondente nella tabella EmpSalary, il loro salario viene visualizzato come NULL nel set di risultati.
Quindi, se A e B sono due entità, il join esterno sinistro restituirà il set di risultati che sarà uguale a 'Record in A NON B', in base alla chiave di corrispondenza.
Ora osserviamo cosa fa il Right Outer Join.
Query:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Risultato:
ID Dipendente | Nome dipendente | EmployeeSalary |
---|---|---|
NULLO | NULLO | 90000 |
1 | John | 50.000 |
Due | Samantha | 120000 |
3 | Nessuna | 75000 |
4 | Setoso | 25000 |
5 | Ram | 150000 |
6 | Arpit | 80000 |
NULLO | NULLO | 250.000 |
NULLO | NULLO | 250.000 |
Nel set di risultati sopra, puoi vedere che il join esterno destro ha fatto esattamente l'opposto del join sinistro. Ha restituito tutti gli stipendi dalla tabella giusta, ovvero la tabella EmpSalary.
Tuttavia, poiché Rose, Sakshi e Jack non hanno un ID dipendente corrispondente nella tabella di sinistra, ad esempio la tabella EmpDetails, abbiamo ottenuto il loro ID dipendente e EmployeeName come NULL dalla tabella di sinistra.
Quindi, se A e B sono due entità, il join esterno destro restituirà il set di risultati che sarà uguale a 'Record in B NON A', in base alla chiave di corrispondenza.
Vediamo anche quale sarà il set di risultati se stiamo facendo un'operazione di selezione su tutte le colonne in entrambe le tabelle.
Query:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Risultato:
ID Dipendente | Nome dipendente | ID Dipendente | Nome dipendente | EmployeeSalary |
---|---|---|---|---|
NULLO | NULLO | undici | Rosa | 90000 |
1 | John | 1 | John | 50.000 |
Due | Samantha | Due | Samantha | 120000 |
3 | Nessuna | 3 | Nessuna | 75000 |
4 | Setoso | 4 | Setoso | 25000 |
5 | Ram | 5 | Ram | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
NULLO | NULLO | 12 | Sakshi | 250.000 |
NULLO | NULLO | 13 | Jack | 250.000 |
Ora, passiamo al Full Join.
Un join esterno completo viene eseguito quando vogliamo tutti i dati da entrambe le tabelle indipendentemente dal fatto che ci sia una corrispondenza o meno. Quindi, se desidero tutti i dipendenti anche se non trovo una chiave di corrispondenza, eseguirò una query come mostrato di seguito.
Query:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Risultato:
ID Dipendente | Nome dipendente | ID Dipendente | Nome dipendente | EmployeeSalary |
---|---|---|---|---|
7 | Giglio | NULLO | NULLO | NULLO |
1 | John | 1 | John | 50.000 |
Due | Samantha | Due | Samantha | 120000 |
3 | Nessuna | 3 | Nessuna | 75000 |
4 | Setoso | 4 | Setoso | 25000 |
5 | Ram | 5 | Ram | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
8 | Sita | NULLO | NULLO | NULLO |
9 | Farah | NULLO | NULLO | NULLO |
10 | Jerry | NULLO | NULLO | NULLO |
NULLO | NULLO | undici | Rosa | 90000 |
NULLO | NULLO | 12 | Sakshi | 250.000 |
NULLO | NULLO | 13 | Jack | 250.000 |
Puoi vedere nel set di risultati sopra che poiché i primi sei record corrispondono in entrambe le tabelle, abbiamo tutti i dati senza alcun NULL. I quattro record successivi esistono nella tabella di sinistra ma non nella tabella di destra, quindi i dati corrispondenti nella tabella di destra sono NULL.
Gli ultimi tre record esistono nella tabella di destra e non nella tabella di sinistra, quindi abbiamo NULL nei dati corrispondenti dalla tabella di sinistra. Quindi, se A e B sono due entità, il join esterno completo restituirà il set di risultati che sarà uguale a 'Record in A AND B', indipendentemente dalla chiave corrispondente.
Teoricamente, è una combinazione di Left Join e Right Join.
Prestazione
Confrontiamo un join interno con un join esterno sinistro nel server SQL. Parlando della velocità di operazione, un JOIN esterno sinistro non è ovviamente più veloce di un join interno.
Secondo la definizione, un join esterno, sia esso sinistro o destro, deve eseguire tutto il lavoro di un join interno insieme al lavoro aggiuntivo nullo, estendendo i risultati. Si prevede che un outer join restituisca un numero maggiore di record, il che aumenta ulteriormente il tempo di esecuzione totale solo a causa del set di risultati più grande.
Pertanto, un join esterno è più lento di un join interno.
Inoltre, possono esserci alcune situazioni specifiche in cui il join sinistro sarà più veloce di un join interno, ma non possiamo procedere per sostituirli l'uno con l'altro poiché un join esterno sinistro non è funzionalmente equivalente a un join interno.
Parliamo di un'istanza in cui il Left Join potrebbe essere più veloce dell'Inner Join. Se le tabelle coinvolte nell'operazione di join sono troppo piccole, diciamo che hanno meno di 10 record e che le tabelle non possiedono indici sufficienti per coprire la query, in tal caso il Left Join è generalmente più veloce di Inner Join.
Creiamo le due tabelle seguenti e facciamo un INNER JOIN e un LEFT OUTER JOIN tra di loro come esempio:
CREATE TABLE #Table1 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table1 (ID, Name) VALUES (1, 'A') INSERT #Table1 (ID, Name) VALUES (2, 'B') INSERT #Table1 (ID, Name) VALUES (3, 'C') INSERT #Table1 (ID, Name) VALUES (4, 'D') INSERT #Table1 (ID, Name) VALUES (5, 'E') CREATE TABLE #Table2 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table2 (ID, Name) VALUES (1, 'A') INSERT #Table2 (ID, Name) VALUES (2, 'B') INSERT #Table2 (ID, Name) VALUES (3, 'C') INSERT #Table2 (ID, Name) VALUES (4, 'D') INSERT #Table2 (ID, Name) VALUES (5, 'E') SELECT * FROM #Table1 t1 INNER JOIN #Table2 t2 ON t2.Name = t1.Name
ID | Nome | ID | Nome | |
---|---|---|---|---|
Di seguito è la visualizzazione di un inner join: ![]() | Di seguito è la visualizzazione di un outer join ![]() | |||
1 | 1 | PER | 1 | PER |
Due | Due | B | Due | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | E | 5 | E |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
ID | Nome | ID | Nome | |
---|---|---|---|---|
1 | 1 | PER | 1 | PER |
Due | Due | B | Due | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | E | 5 | E |
Come puoi vedere sopra, entrambe le query hanno restituito lo stesso set di risultati. In questo caso, se si visualizza il piano di esecuzione di entrambe le query, si noterà che l'unione interna è costata di più rispetto all'unione esterna. Questo perché, per un inner join, il server SQL esegue una corrispondenza hash mentre esegue cicli nidificati per il join sinistro.
Una corrispondenza hash è normalmente più veloce dei cicli annidati. Ma, in questo caso, poiché il numero di righe è così piccolo e non vi è alcun indice da usare (poiché stiamo facendo join sulla colonna del nome), l'operazione di hash si è rivelata una query di inner join più costosa.
Tuttavia, se si modifica la chiave di corrispondenza nella query di join da Nome a ID e se nella tabella è presente un numero elevato di righe, si noterà che il join interno sarà più veloce del join esterno sinistro.
MS Access Inner e Outer Join
Quando si utilizzano più origini dati nella query di MS Access, si applicano i JOIN per controllare i record che si desidera visualizzare, a seconda di come le origini dati sono collegate tra loro.
In un join interno, solo quelli correlati di entrambe le tabelle vengono combinati in un unico set di risultati. Questo è un join predefinito in Access e anche quello utilizzato più di frequente. Se si applica un join ma non si specifica esplicitamente il tipo di join, Access presume che sia un inner join.
Negli outer join, tutti i dati correlati di entrambe le tabelle vengono combinati correttamente, più tutte le righe rimanenti di una tabella. Nei join esterni completi, tutti i dati vengono combinati ove possibile.
Join sinistro vs Join esterno sinistro
In SQL Server, la parola chiave outer è facoltativa quando si applica il join esterno sinistro. Pertanto, non fa alcuna differenza se scrivi 'LEFT OUTER JOIN' o 'LEFT JOIN' poiché entrambi ti daranno lo stesso risultato.
A LEFT JOIN B è una sintassi equivalente a A LEFT OUTER JOIN B.
Di seguito è riportato l'elenco delle sintassi equivalenti nel server SQL:
(Immagine fonte )
Join esterno sinistro vs join esterno destro
Abbiamo già visto questa differenza in questo articolo. Puoi fare riferimento alle query Left Outer Join e Right Outer Join e al set di risultati per vedere la differenza.
La principale differenza tra Left Join e Right Join risiede nell'inclusione di righe non abbinate. Il join esterno sinistro include le righe senza corrispondenza della tabella che si trova a sinistra della clausola di join, mentre un join esterno destro include le righe senza corrispondenza della tabella che si trova a destra della clausola di join.
Le persone chiedono quale sia meglio usare, ad esempio Left join o Right join? Fondamentalmente, sono lo stesso tipo di operazioni tranne che con i loro argomenti invertiti. Quindi, quando chiedi quale join usare, in realtà stai chiedendo se scrivere un file un. È solo una questione di preferenza.
In generale, le persone preferiscono utilizzare Left join nella loro query SQL. Ti suggerisco di rimanere coerente nel modo in cui stai scrivendo la query per evitare qualsiasi confusione nell'interpretazione della query.
Finora abbiamo visto tutto su Inner join e tutti i tipi di Outer join. Riassumiamo rapidamente la differenza tra Inner Join e Outer Join.
Differenza tra Inner Join e Outer Join in formato tabulare
Inner Join | Outer Join |
---|---|
Restituisce solo le righe che hanno valori corrispondenti in entrambe le tabelle. | Include le righe corrispondenti così come alcune delle righe non corrispondenti tra le due tabelle. |
Nel caso in cui vi sia un numero elevato di righe nelle tabelle e vi sia un indice da utilizzare, INNER JOIN è generalmente più veloce di OUTER JOIN. | In genere, un OUTER JOIN è più lento di un INNER JOIN in quanto deve restituire un numero maggiore di record rispetto a INNER JOIN. Tuttavia, possono esserci alcuni scenari specifici in cui OUTER JOIN è più veloce. |
Quando una corrispondenza non viene trovata, non restituisce nulla. | Quando non viene trovata una corrispondenza, viene inserito un NULL nel valore della colonna restituito. |
Utilizzare INNER JOIN quando si desidera cercare informazioni dettagliate su una colonna specifica. | Utilizzare OUTER JOIN quando si desidera visualizzare l'elenco di tutte le informazioni nelle due tabelle. |
INNER JOIN agisce come un filtro. Affinché un inner join restituisca i dati, deve esserci una corrispondenza su entrambe le tabelle. | Agiscono come componenti aggiuntivi di dati. |
Esiste una notazione di join implicita per inner join che inserisce le tabelle da unire in modo separato da virgole nella clausola FROM. Esempio: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID; | Non esiste alcuna notazione di join implicita per il join esterno. |
Unione interna ed esterna contro Unione
A volte, confondiamo Join e Union e questa è anche una delle domande più frequenti in Interviste SQL . Abbiamo già visto la differenza tra inner join e outer join. Ora, vediamo come un JOIN è diverso da un UNION.
UNION inserisce una riga di query una dopo l'altra, mentre join crea un prodotto cartesiano e lo sottosetta. Pertanto, UNION e JOIN sono operazioni completamente diverse.
Eseguiamo le due query seguenti in MySQL e vediamo il loro risultato.
Query UNION:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Risultato:
Bah | |
---|---|
1 | 28 |
Due | 35 |
JOIN Query:
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
Risultato:
foo | Bar | |
---|---|---|
1 | 38 | 35 |
Un'operazione UNION inserisce il risultato di due o più query in un unico set di risultati. Questo set di risultati contiene tutti i record restituiti tramite tutte le query coinvolte in UNION. Quindi, fondamentalmente, un'UNIONE sta combinando i due set di risultati insieme.
Un'operazione di join recupera i dati da due o più tabelle in base alle relazioni logiche tra queste tabelle, ovvero in base alla condizione di join. Nella query di join, i dati di una tabella vengono utilizzati per selezionare i record da un'altra tabella. Ti consente di collegare dati simili presenti su tabelle diverse.
Per capirlo in modo molto semplice, puoi dire che un'UNIONE combina le righe di due tabelle mentre un join combina le colonne di due o più tabelle. Pertanto, entrambi vengono utilizzati per combinare i dati di n tabelle, ma la differenza sta nel modo in cui i dati vengono combinati.
Di seguito sono riportate le rappresentazioni pittoriche di UNION e JOIN.
Quanto sopra è una rappresentazione grafica di un'operazione di join che descrive che ogni record nel set di risultati contiene colonne da entrambe le tabelle, ad esempio la tabella A e la tabella B. Questo risultato viene restituito in base alla condizione di join applicata nella query.
Un join è generalmente il risultato della denormalizzazione (opposta alla normalizzazione) e utilizza la chiave esterna di una tabella per cercare i valori della colonna utilizzando la chiave primaria in un'altra tabella.
miglior programma per correggere gli errori di registro
Quanto sopra è una rappresentazione grafica di un'operazione UNION che descrive che ogni record nel set di risultati è una riga di una delle due tabelle. Pertanto, il risultato dell'UNIONE ha combinato le righe della tabella A e della tabella B.
Ulteriore lettura = >> MySQL UNION spiegato con esempi
Conclusione
In questo articolo, abbiamo visto le principali differenze tra Inner Join e Outer Join in SQL . Abbiamo anche visto la classificazione di un join esterno, ovvero join sinistro, join destro e join completo. Abbiamo visto come funzionano ciascuno di questi tipi di join e come variano l'uno dall'altro.
Abbiamo anche effettuato un confronto delle prestazioni tra questi tipi di join. Abbiamo anche discusso di come un'unione sia diversa da un'unione.
Leggi anche = >> Tipi di join MySQL
Spero che questo articolo ti abbia aiutato a chiarire i tuoi dubbi sulle differenze tra i vari tipi di join. Siamo sicuri che questo effettivamente ti farà decidere quale tipo di join scegliere in base al set di risultati desiderato.
Lettura consigliata
- Differenza esatta tra verifica e convalida con esempi
- Modem Vs Router: conosci l'esatta differenza
- Differenza tra SQL Vs MySQL Vs SQL Server (con esempi)
- Tutorial Python DateTime con esempi
- LAN Vs WAN Vs MAN: differenza esatta tra i tipi di rete
- Comando Taglia in Unix con esempi
- Sintassi dei comandi Cat Unix, opzioni con esempi
- Utilizzo del cursore in MongoDB con esempi