Torna all'elenco degli articoli Articoli
Tempo di lettura: 7 minuti

Come mantenere le righe non abbinate quando si uniscono due tabelle in SQL

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 chiamata project.

Ecco come appaiono i dati della tabella employee della tabella:

idfirst_namelast_nameproject_id
1IngaDansken1
2RosinaSneezem5
3DarRisbie4
4LyneaBraveyNULL
5AlanahAbrashkov4
6EmmitJaime4
7KarrieLatek5
8GarrettCreginNULL
9CecilioZiemkeNULL
10MalanieChapellow1
11FraydaPinkett1
12MaddiMullissNULL
13BlaneTue5
14CarverVeighey5
15ChristosManleyNULL

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:

idproject_name
1Reporting Process
2Database Enhancement
3Sales Boosting
4Employee Satisfaction
5IT Security
6Diversity Program
7Policies & Procedures
8Social Media Visibility
9Mobile Banking
10Education

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_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT 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 (employeein questo caso) e tutti i dati corrispondenti della tabella di destra (project). Quando non ci sono dati corrispondenti nella tabella projectsi ottengono i valori di NULL., ma si ottengono comunque tutti i valori dalla tabella employee. Guardate voi stessi:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

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, projecte solo le righe corrispondenti della tabella di sinistra, employee. Anche in questo caso, quando non ci sono dati corrispondenti nella tabella employeei valori saranno NULL.

Questo è il risultato della query:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation

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_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

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.