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:
Questa è la sintassi per un 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.
La sintassi è la seguente. Puoi notare che è simile alla sintassi dell'Inner Join, ma con l'aggiunta della parola chiave LEFT
.
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.
La sintassi è la seguente, l'unica differenza è la parola chiave RIGHT
.
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.
La sintassi è la seguente, usando la parola chiave FULL
.
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
).
ID | NAME | AGE | OWNER_ID |
---|---|---|---|
1 | Fido | 7 | 1 |
2 | Missy | 3 | 1 |
3 | Sissy | 10 | 2 |
4 | Copper | 1 | 3 |
5 | Hopper | 2 | 0 |
ID | NAME | PHONE_NUMBER |
---|---|---|
1 | Johnny | 4567823 |
2 | Olly | 7486513 |
3 | Ilenia | 3481365 |
4 | Luise | 1685364 |
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_NAME | OWNER |
---|---|
Fido | Johnny |
Missy | Johnny |
Sissy | Olly |
Copper | Ilenia |
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_NAME | OWNER |
---|---|
Fido | Johnny |
Missy | Johnny |
Sissy | Olly |
Copper | Ilenia |
Hopper | NULL |
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_NAME | OWNER |
---|---|
Fido | Johnny |
Missy | Johnny |
Sissy | Olly |
Copper | Ilenia |
NULL | Louise |
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_NAME | OWNER |
---|---|
Fido | Johnny |
Missy | Johnny |
Sissy | Olly |
Copper | Ilenia |
Hopper | NULL |
NULL | Louise |
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!