Articolo originale: SQL Join Types – Inner Join VS Outer Join Example

In un database relazionale, tutte le informazioni dovrebbero essere presenti una sola volta. Tuttavia, potresti avere delle informazioni correlate tra loro separate in tabelle differenti.

E potresti voler mettere insieme queste informazioni correlate per analizzarne i dati, ovvero potresti voler unire tutti i dati (o parte di essi). In questo caso, avrai bisogno di utilizzare l'istruzione JOIN di SQL. Impariamo come funziona.

Cos'è JOIN in SQL?

L'operatore JOIN ti permette di combinare informazioni correlate in modi diversi, come spiegato precedentemente in breve. Ci sono diversi tipi di join, divisi in due categorie principali - INNER join e OUTER join.

La differenza principale tra un INNER JOIN e un OUTER JOIN è che l'inner join manterrà (nella tabella risultante) solo le informazioni derivanti da entrambe le tabelle che sono correlate tra loro. Un Outer Join, invece, manterrà anche le informazioni che non sono correlate all'altra tabella nella tabella risultante.

Cerchiamo di capire meglio INNER JOIN e OUTER JOIN vedendo come funzionano nel dettaglio.

Come usare INNER JOIN in SQL

L'inner join manterrà solo le informazioni correlate presenti nelle due tabelle unite. Se immagini le due tabelle come un diagramma di Venn, la tabella risultante dall'INNER JOIN corrisponderà alla sezione colorata in verde qui sotto, dove si verifica l'intersezione tra di esse:

Two circles, one labelled table 1 and one labelled table 2, with a section in common. The section in common is colored in green.
Inner Join - Rappresentazione mediante diagramma di Venn

Questa è la sintassi per un inner join:

SELECT * FROM tabella1
    JOIN tabella2
    ON relazione;
sintassi INNER JOIN

Vedremo di seguito come funziona con un esempio.

Come usare OUTER JOIN in SQL

Se vuoi mantenere tutti i dati, e non solo dati correlati tra loro, puoi usare un OUTER JOIN.

Ci sono tre tipi di Outer Join: LEFT JOIN, RIGHT JOIN e FULL JOIN. Le differenze tra loro riguardano quali dati non correlati mantengono - possono provenire dalla prima tabella, dalla seconda, o da entrambe. Le celle senza dati da riempire avranno valore NULL.

Nota: LEFT JOIN è quello universalmente più implementato in tutte le versioni di SQL. Non vale lo stesso per RIGHT JOIN e FULL JOIN, che non sono implementati in diverse versioni di SQL.

Vediamo individualmente il funzionamento di ciascuno di essi. Successivamente, vedremo come funzionano tutti con degli esempi riportati di seguito.

LEFT OUTER JOIN in SQL

Il LEFT OUTER JOIN, o semplicemente Left Join, manterrà i dati non correlati della tabella di sinistra (la prima).

Puoi immaginarlo come un diagramma di Venn con due insiemi, con la tabella risultante data dalla parte evidenziata in verde che include la parte in comune tra i due insiemi (l'intersezione), e la parte rimanente dell'insieme sulla sinistra.

Two circles with a superimposed part. The left circle is labelled as table 1, the right circle is tabelled as table 2. The superimposed part and the rest of the table 1 cirlcle are colored in green.
Left Outer Join - Rappresentazione mediante diagramma di Venn

La sintassi è la seguente. Puoi notare che è simile alla sintassi dell'Inner Join, ma con l'aggiunta della parola chiave LEFT.

SELECT colonne
  FROM tabella1
  LEFT JOIN tabella2
  ON relazione;
sintassi LEFT OUTER JOIN

RIGHT OUTER JOIN in SQL

Il RIGHT OUTER JOIN, o semplicemente Right Join, manterrà i dati della seconda tabella che non sono correlati con la prima.

Lo puoi immaginare come un diagramma di Venn con due insiemi, con la tabella risultante corrispondente alla parte evidenziata in verde che include l'intersezione dei due insiemi e il resto dell'insieme sulla destra.

Two circles with a superimposed part. The left circle is labelled as table 1, the right circle is tabelled as table 2. The superimposed part and the rest of the table 2 cirlcle are colored in green.
Right Outer Join - Rappresentazione mediante diagramma di Venn

La sintassi è la seguente, l'unica differenza è la parola chiave RIGHT.

SELECT colonne
  FROM tabella1
  RIGHT JOIN tabella2
  ON relazione;
sintassi RIGHT OUTER JOIN

FULL OUTER JOIN in SQL

Puoi pensare al FULL OUTER JOIN come la combinazione di Left Join e Right Join. Manterrà dati da entrambe le tabelle, e i dati mancanti saranno riempiti con NULL.

Puoi immaginarlo con un diagramma di Venn con due insiemi, con la tabella risultante corrispondente alla parte evidenziata in verde che include tutto: l'intersezione dei due insiemi, l'insieme a sinistra e quello a destra.

Two circles with a superimposed part. The left circle is labelled as table 1, the right circle is tabelled as table 2. Everything is colored in green.
Full Outer Join - Rappresentazione mediante diagramma di Venn

La sintassi è la seguente, usando la parola chiave FULL.

SELECT colonne
  FROM tabella1
  FULL JOIN tabella2
  ON relazione;
sintassi FULL OUTER JOIN

Esempi dell'operatore JOIN in SQL

Un possibile database per una clinica veterinaria potrebbe avere una tabella per gli animali domestici (pets) e uno per i proprietari (owners). Dato che un proprietario potrebbe avere più animali domestici, la tabella degli animali domestici (pets) avrà una colonna owner_id che punta alla tabella dei proprietari (owners).

IDNAMEAGEOWNER_ID
1Fido71
2Missy31
3Sissy102
4Copper13
5Hopper20
IDNAMEPHONE_NUMBER
1Johnny4567823
2Olly7486513
3Ilenia3481365
4Luise1685364

Potresti usare una semplice query per ottenere una tabella con il nome dell'animale domestico e il nome del proprietario uno accanto all'altro. Facciamolo usando tutti i diversi tipi di JOIN.

Esempio INNER JOIN in SQL

Iniziamo utillizzando JOIN.

In questo caso, occorre selezionare (SELECT) la colonna name dalla tabella pets (rinominandola pet_name). E, successivamente, selezionare la colonna name dalla tabella owners, rinomandola owner. Il codice si presenta così: SELECT pets.name AS pet_name, owners.name AS owner.

Si utilizza FROM per indicare che le colonne provengono dalla tabella degli animali domestici, e JOIN per dire che vuoi unirla con la tabella dei proprietari, usando questa sintassi: FROM pets JOIN owners.

Infine, occorre indicare che vuoi unire due righe insieme quando la colonna owner_id nella tabella degli animali domestici (pets) è uguale alla colonna id nella tabella dei proprietari (owners), con ON pets.owner_id = owners.id.

Questo è il codice tutto assieme:

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  JOIN owners
  ON pets.owner_id = owners.id;

Si ottiene una tabella come la seguente, in cui solo gli animali domestici collegati ad un proprietario e i proprietari collegati ad un animale domestico sono inclusi.

PET_NAMEOWNER
FidoJohnny
MissyJohnny
SissyOlly
CopperIlenia

Esempio LEFT JOIN in SQL

Facciamo la stessa query usando LEFT JOIN in modo che tu possa vedere le differenze. La query è uguale alla precedente aggiungendo la parola chiave LEFT.

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  LEFT JOIN owners
  ON pets.owner_id = owners.id;

In questo caso, le righe dalla tabella a sinistra, pets, sono tutte mantenute, e i valori mancati provenienti dalla tabella owners sono riempiti con il valore NULL.

PET_NAMEOWNER
FidoJohnny
MissyJohnny
SissyOlly
CopperIlenia
HopperNULL

Sembra che ci sia un animale domestico che non è registrato con un proprietario.

Esempio RIGHT JOIN in SQL

Se realizzi la stessa query usando RIGHT JOIN ottieni un risultato differente.

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  RIGHT JOIN owners
  ON pets.owner_id = owners.id;

In questo caso tutte le righe dalla tabella a destra, owners, sono mantenute, e se c'è un valore mancante è riempito con il valore NULL.

PET_NAMEOWNER
FidoJohnny
MissyJohnny
SissyOlly
CopperIlenia
NULLLouise

Sembra ci sia un proprietario che non ha animali domestici registrati.

Esempio FULL JOIN in SQL

Puoi realizzare la stessa query nuovamente, usando FULL JOIN.

SELECT pets.name AS pet_name, owners.name AS owner
  FROM pets
  FULL JOIN owners
  ON pets.owner_id = owners.id;

La tabella risultante è ancora diversa – in questo caso tutte le righe dalle due tabelle sono mantenute.

PET_NAMEOWNER
FidoJohnny
MissyJohnny
SissyOlly
CopperIlenia
HopperNULL
NULLLouise

Sembra che nel nostro database ci sia un animale domestico senza proprietario e un proprietario senza animali domestici.

Conclusione

In un database relazionale, tutti i dati dovrebbero essere scritti solo una volta. Per poter analizzare questi dati, hai bisogno di qualcosa per unire i dati correlati insieme.

In questo articolo hai imparato come utilizzare l'operatore JOIN per farlo. Spero che ti sarà utile, divertiti!