Come mantenere le righe non abbinate quando si uniscono due tabelle in SQL
Indice
- Quale JOIN vi dà le righe non corrispondenti?
- Conoscere i dati
- Che cosa succede quando si usa l'INNER JOIN?
- Ottenere tutte le righe corrispondenti e non corrispondenti da una tabella
- La JOIN COMPLETA permette di ottenere tutte le righe abbinate e non abbinate?
- Quando usare quale JOIN
- Imparate i diversi tipi di JOIN per scegliere quello che vi serve!
Imparate a usare JOIN per conservare sia le righe corrispondenti che quelle non corrispondenti quando unite due tabelle.
L'unione di due o più tabelle è un'abilità molto richiesta se si lavora con i database. Per ripassare e mettere in pratica le abilità di unione in SQL, vi consiglio il corso interattivo SQL JOINs . Contiene oltre 90 esercizi e sezioni su diverse sfide di unione.
Se vi capita spesso di unire tabelle in SQL, avrete probabilmente notato che non tutti i dati di una tabella corrispondono sempre ai dati di un'altra tabella. A volte sono necessari solo i dati che hanno una corrispondenza in entrambe le tabelle. A volte, invece, è necessario conservare le righe non corrispondenti. Come si fa in JOIN
?
Quale JOIN vi dà le righe non corrispondenti?
Probabilmente lo sapete già, ma vale la pena ripeterlo. Lo scopo di JOIN
è quello di ottenere i dati da due o più tabelle. Le si unisce in base alle colonne che hanno in comune.
I quattro tipi principali di JOINs
sono:
(INNER) JOIN
.LEFT (OUTER) JOIN
.RIGHT (OUTER) JOIN
.FULL (OUTER) JOIN
.
Quando si utilizza un semplice (INNER) JOIN
, si otterranno solo le righe che hanno una corrispondenza in entrambe le tabelle. La query non restituirà in alcun modo le righe non corrispondenti.
Se questo non è ciò che si desidera, la soluzione è utilizzare LEFT JOIN
, RIGHT JOIN
, o FULL JOIN
, a seconda di ciò che si desidera vedere.
Se non conoscete JOIN
, qui trovate una spiegazione esauriente di ogni tipo di JOIN. Potete anche avere a portata di mano un foglio informativo sulle JOIN SQL per aiutarvi con la sintassi e l'uso di JOIN
.
Conoscere i dati
I dati con cui lavoreremo sono costituiti da due tabelle:
employee
.project
.
La tabella employee
ha quattro colonne:
id
: L'ID del dipendente; è la chiave primaria (PK) della tabella.first_name
: Il nome del dipendente.last_name
: Il cognome del dipendente.project_id
: L'ID del progetto e la chiave esterna (FK) della tabella, che fa riferimento a un'altra tabella chiamataproject
.
Ecco come appaiono i dati della tabella employee
della tabella:
id | first_name | last_name | project_id |
---|---|---|---|
1 | Inga | Dansken | 1 |
2 | Rosina | Sneezem | 5 |
3 | Dar | Risbie | 4 |
4 | Lynea | Bravey | NULL |
5 | Alanah | Abrashkov | 4 |
6 | Emmit | Jaime | 4 |
7 | Karrie | Latek | 5 |
8 | Garrett | Cregin | NULL |
9 | Cecilio | Ziemke | NULL |
10 | Malanie | Chapellow | 1 |
11 | Frayda | Pinkett | 1 |
12 | Maddi | Mulliss | NULL |
13 | Blane | Tue | 5 |
14 | Carver | Veighey | 5 |
15 | Christos | Manley | NULL |
Ci sono due colonne nella tabella project
:
id
: L'ID del progetto; è la chiave primaria (PK) della tabella.project_name
: Il nome del progetto.
Questi sono i dati della tabella:
id | project_name |
---|---|
1 | Reporting Process |
2 | Database Enhancement |
3 | Sales Boosting |
4 | Employee Satisfaction |
5 | IT Security |
6 | Diversity Program |
7 | Policies & Procedures |
8 | Social Media Visibility |
9 | Mobile Banking |
10 | Education |
Che cosa succede quando si usa l'INNER JOIN?
Per ottenere il nome dei dipendenti e i progetti su cui stanno lavorando utilizzando INNER JOIN
, è necessario scrivere questo codice:
SELECT first_name, last_name, project_name FROM employee e JOIN project p ON e.project_id = p.id; |
Nota: naturalmente è possibile utilizzare come parola chiave JOIN
o INNER JOIN
, che sono la stessa cosa.
Ecco cosa si ottiene come risultato:
first_name | last_name | project_name |
---|---|---|
Frayda | Pinkett | Reporting Process |
Malanie | Chapellow | Reporting Process |
Inga | Dansken | Reporting Process |
Emmit | Jaime | Employee Satisfaction |
Alanah | Abrashkov | Employee Satisfaction |
Dar | Risbie | Employee Satisfaction |
Carver | Veighey | IT Security |
Blane | Tue | IT Security |
Karrie | Latek | IT Security |
Rosina | Sneezem | IT Security |
Il risultato mostra solo le righe della tabella employee
che corrispondono alle righe della tabella project
. In altre parole, il codice restituisce solo i dipendenti a cui è stato assegnato un progetto. Questo, tuttavia, significa che ogni tabella può avere righe che non corrispondono all'altra tabella. Potrebbero esserci dei dipendenti che non sono assegnati ad alcun progetto e potrebbero esserci dei progetti a cui non è stato assegnato alcun dipendente.
Come si fa a ottenere anche le righe non abbinate?
Ottenere tutte le righe corrispondenti e non corrispondenti da una tabella
Per ottenere tutte le righe da una sola tabella, sia quelle corrispondenti che quelle non corrispondenti, è necessario utilizzare il comando LEFT JOIN
o RIGHT JOIN
. Quale utilizzare dipende da quale tabella si desidera conservare le righe non corrispondenti. LEFT JOIN
lo farà dalla tabella di sinistra, RIGHT JOIN
da quella di destra. Vi mostrerò cosa significa in pratica.
Uso della CONGIUNZIONE SINISTRA
Per ottenere le righe abbinate e non abbinate da una tabella utilizzando LEFT JOIN
, dovrete scrivere questo codice:
SELECT first_name, last_name, project_name FROM employee e LEFT JOIN project p ON e.project_id = p.id; |
È quasi lo stesso codice dell'esempio precedente. L'unica differenza è che si utilizza la parola chiave LEFT JOIN
invece di JOIN
. In questo modo si otterranno tutti i dati dalla tabella di sinistra (employee
in questo caso) e tutti i dati corrispondenti della tabella di destra (project
). Quando non ci sono dati corrispondenti nella tabella project
si ottengono i valori di NULL
., ma si ottengono comunque tutti i valori dalla tabella employee
. Guardate voi stessi:
first_name | last_name | project_name |
---|---|---|
Frayda | Pinkett | Reporting Process |
Malanie | Chapellow | Reporting Process |
Inga | Dansken | Reporting Process |
Emmit | Jaime | Employee Satisfaction |
Alanah | Abrashkov | Employee Satisfaction |
Dar | Risbie | Employee Satisfaction |
Carver | Veighey | IT Security |
Blane | Tue | IT Security |
Karrie | Latek | IT Security |
Rosina | Sneezem | IT Security |
Christos | Manley | NULL |
Maddi | Mulliss | NULL |
Cecilio | Ziemke | NULL |
Garrett | Cregin | NULL |
Lynea | Bravey | NULL |
Come si interpretano questi dati? Ci sono tutti i dipendenti e i progetti a cui lavorano. Quando c'è un valore NULL
nella colonna project_name
, significa che il dipendente in questione non sta lavorando ad alcun progetto.
Uso della GIUNTA DESTRA
Ora scriviamo lo stesso codice con RIGHT JOIN
invece di usare LEFT JOIN
.
SELECT first_name, last_name, project_name FROM employee e RIGHT JOIN project p ON e.project_id = p.id; |
È l'immagine speculare del codice precedente. Restituirà tutti i dati della tabella di destra, project
e solo le righe corrispondenti della tabella di sinistra, employee
. Anche in questo caso, quando non ci sono dati corrispondenti nella tabella employee
i valori saranno NULL
.
Questo è il risultato della query:
first_name | last_name | project_name |
---|---|---|
Frayda | Pinkett | Reporting Process |
Malanie | Chapellow | Reporting Process |
Inga | Dansken | Reporting Process |
NULL | NULL | Database Enhancement |
NULL | NULL | Sales Boosting |
Emmit | Jaime | Employee Satisfaction |
Alanah | Abrashkov | Employee Satisfaction |
Dar | Risbie | Employee Satisfaction |
Carver | Veighey | IT Security |
Blane | Tue | IT Security |
Karrie | Latek | IT Security |
Rosina | Sneezem | IT Security |
NULL | NULL | Diversity Program |
NULL | NULL | Policies & Procedures |
NULL | NULL | Social Media Visibility |
NULL | NULL | Mobile Banking |
NULL | NULL | Education |
Ora, questi dati mostrano tutti i progetti esistenti nella tabella project
. Quando le colonne first_name
e last_name
sono NULL
, significa che non c'è nessun dipendente che lavora su quel progetto.
La JOIN COMPLETA permette di ottenere tutte le righe abbinate e non abbinate?
Credo che la query che utilizza la FULL JOIN e il suo risultato parlino da soli. Vediamo cosa fa. Innanzitutto, la query:
SELECT first_name, last_name, project_name FROM employee e FULL JOIN project p ON e.project_id = p.id; |
Anche in questo caso, l'unica differenza rispetto alle query precedenti è il tipo di join utilizzato. Tutto il resto è uguale. Questa query FULL JOIN
restituirà i seguenti dati:
first_name | last_name | project_name |
---|---|---|
Frayda | Pinkett | Reporting Process |
Malanie | Chapellow | Reporting Process |
Inga | Dansken | Reporting Process |
NULL | NULL | Database Enhancement |
NULL | NULL | Sales Boosting |
Emmit | Jaime | Employee Satisfaction |
Alanah | Abrashkov | Employee Satisfaction |
Dar | Risbie | Employee Satisfaction |
Carver | Veighey | IT Security |
Blane | Tue | IT Security |
Karrie | Latek | IT Security |
Rosina | Sneezem | IT Security |
NULL | NULL | Diversity Program |
NULL | NULL | Policies & Procedures |
NULL | NULL | Social Media Visibility |
NULL | NULL | Mobile Banking |
NULL | NULL | Education |
Christos | Manley | NULL |
Maddi | Mulliss | NULL |
Cecilio | Ziemke | NULL |
Garrett | Cregin | NULL |
Lynea | Bravey | NULL |
Esaminiamo un po' i dati. Ci sono righe che si trovano in entrambe le tabelle. Tuttavia, ci sono righe della tabella employee
che non hanno righe corrispondenti nella tabella project
. Queste righe possono essere identificate dai valori NULL
nella colonna project_name
. Ci sono anche righe della tabella project
che non hanno righe corrispondenti nella tabella employee
. Anche in questo caso, i valori di NULL
si trovano qui. Questa volta, i valori NULLs
saranno nelle colonne first_name
e last_name
.
Quando usare quale JOIN
Ora che si è visto cosa restituisce ogni JOIN
, chiariamo cosa fa ogni JOIN
.
JOIN
o INNER JOIN
non restituisce alcuna riga non corrispondente. Restituisce solo le righe che corrispondono in entrambe le tabelle unite. Se si desidera ottenere righe non corrispondenti, non è consigliabile utilizzarlo.
I metodi LEFT JOIN
e RIGHT JOIN
restituiscono sia le righe corrispondenti che quelle non corrispondenti. Tuttavia, è necessario sapere da quale tabella si ottengono le righe non abbinate. In base alle proprie esigenze, si utilizzerà LEFT JOIN
o RIGHT JOIN
. Entrambi ottengono tutte le righe da una tabella (abbinate e non abbinate) e tutte le righe corrispondenti dall'altra tabella. Quando nell'altra tabella non si trovano righe corrispondenti, le colonne dell'altra tabella mostrano i valori NULL
.
FULL JOIN
fornisce tutti i dati di tutte le tabelle unite. È come combinare i tre join precedenti. Si ottengono tutte le righe corrispondenti come quando si usa INNER JOIN
. Si ottengono anche le righe non corrispondenti dalla tabella di sinistra e dalla tabella di destra. È come se si usassero contemporaneamente LEFT JOIN
e RIGHT JOIN
.
Ecco altri esempi per esercitarsi a unire le tabelle.
Imparate i diversi tipi di JOIN per scegliere quello che vi serve!
Sapere come funzionano queste JOINs
è molto utile. Permettono di unire due o più tabelle e di ottenere diverse combinazioni di dati da ogni tabella. Non c'è alcuna differenza nel modo in cui si scrive il codice. L'unica cosa che cambia è la parola chiave che si usa a seconda del tipo di JOIN
che serve. È molto importante capire quali dati restituisce ciascuno di questi JOINs
.
Per padroneggiare e mettere in pratica questa abilità, il corso SQL Basics e il corso SQL JOINs sono ciò che vi serve! Se avete bisogno di consigli su come esercitarvi con le JOIN, ecco alcuni suggerimenti.