Un join SQL è un'o­pe­ra­zio­ne di in­ter­ro­ga­zio­ne che collega più tabelle di un database re­la­zio­na­le e re­sti­tui­sce i loro dati (tuple) filtrati in base a una con­di­zio­ne di selezione definita dal­l'u­ten­te.

Il tipo di join più comune del modello di database re­la­zio­na­le è l'inner join SQL. In pratica, gli utenti uti­liz­za­no le inner join, ad esempio, se due tabelle di database devono essere collegate con le stesse colonne. Ogni record di dati di una tabella è combinato con un cor­ri­spon­den­te record di dati del­l'al­tra tabella. I record di dati per i quali il sistema di gestione dei database (DBMS) non riesce a trovare una cor­ri­spon­den­za nel­l'al­tra tabella vengono nascosti.

Una outer join SQL, invece, re­sti­tui­sce non solo i record di dati di entrambe le tabelle che sod­di­sfa­no la con­di­zio­ne di selezione (ad esempio l'u­gua­glian­za dei valori di due colonne), ma anche tutte le altre tuple dell'una o del­l'al­tra tabella.

Registra il tuo dominio
  • Domain Connect gratuito per una con­fi­gu­ra­zio­ne facile del DNS
  • Cer­ti­fi­ca­to SSL Wildcard gratuito
  • Pro­te­zio­ne privacy inclusa

Ri­fe­ren­do­si alla direzione di lettura della sintassi SQL si parla di tabella sinistra e destra. Le ri­spet­ti­ve ope­ra­zio­ni sono pertanto de­no­mi­na­te left outer join e right outer join. Se, oltre ai record di dati che sod­di­sfa­no la con­di­zio­ne di selezione, si desidera anche vi­sua­liz­za­re tutti i record di dati della tabella sinistra e destra nelle query del database, si parla di una full outer join.

Il principio dei diversi tipi di join si può chiarire bene ser­ven­do­si di una rap­pre­sen­ta­zio­ne grafica:

Sot­to­ca­te­go­rie dell’outer join

Ogni outer join è rea­liz­za­ta come left outer join, right outer join o full outer join.

Consiglio

La parola chiave OUTER è opzionale nella sintassi SQL. So­li­ta­men­te gli utenti usano la notazione ab­bre­via­ta left join, right join e full join

Il­lu­stria­mo la fun­zio­na­li­tà delle outer join uti­liz­zan­do le tabelle del database "col­la­bo­ra­to­ri" e "auto".

Tabella: col­la­bo­ra­to­ri

c_id cognome nome auto_id
1 Bianchi Maria 3
2 Rossi Giada 1
3 Padovan Gianluca 1
4 Terragna Eli­sa­bet­ta 2
5 Verdi Marco ZERO

La tabella "col­la­bo­ra­to­ri" comprende il nome e il cognome dei di­pen­den­ti di un'a­zien­da fittizia e l'ID dell'auto aziendale assegnata (auto_id). La chiave primaria della tabella è un ID di­pen­den­te coerente (c_id). Al col­la­bo­ra­to­re con ID 5 (Marco Verdi) non è stata ancora assegnata un'auto aziendale. La cella della colonna cor­ri­spon­den­te contiene quindi un valore zero.

N.B.

Il valore zero rap­pre­sen­ta l’assenza di un valore. Non cor­ri­spon­de al valore numerico 0.

Tabella: auto

auto_id marca modello targa anno di co­stru­zio­ne revisione
1 VW Caddy B KH 778 2016 18.12.2018
2 Opel Astra B PO 654 2010 12.08.2019
3 BMW X6 B MW 780 2017 01.09.2018
4 Porsche Boxster B AA 123 2018 23.12.2020

Le in­for­ma­zio­ni sul parco veicoli della società sono state riportate nella tabella "auto": la marca dell'auto aziendale, il modello, la targa, l'anno di co­stru­zio­ne e la data della prossima revisione (revisione). A ogni auto aziendale viene assegnato un ID coerente (auto_id), che funge da chiave primaria della tabella.

Entrambe le tabelle sono collegate da una relazione a chiave esterna. La chiave primaria della tabella "auto" (auto_id) è stata integrata come chiave esterna nella tabella "col­la­bo­ra­to­ri". Questo ci permette di collegare entrambe le tabelle tramite una colonna comune.

N.B.

Mentre le chiavi primarie valide non possono com­pren­de­re valori zero, gli stessi valori nelle chiavi esterne non dan­neg­gia­no l’integrità di un record di dati.

Left outer join SQL

In una left outer join la tabella sul lato sinistro dell’operatore join viene con­si­de­ra­ta la tabella dominante. Nell’algebra re­la­zio­na­le, le left outer join sono annotate con il seguente operatore: .

Per collegare le tabelle "col­la­bo­ra­to­ri" e "auto" in una left outer join è possibile ricorrere alla seguente ope­ra­zio­ne:

col­la­bo­ra­to­ri ⟕ auto_id=auto_idauto

L’in­te­ra­zio­ne con DBMS è nel lin­guag­gio di database SQL. La formula descritta sopra cor­ri­spon­de alla seguente di­chia­ra­zio­ne SQL:

SELECT * FROM collaboratori LEFT JOIN auto ON collaboratori.auto_id = auto.auto_id;

La tabella "col­la­bo­ra­to­ri" si trova sul lato sinistro del­l'o­pe­ra­to­re join, la tabella "auto" sul lato destro. Definiamo col­la­bo­ra­to­ri.auto_id = auto.auto_id come con­di­zio­ne di selezione. L'insieme dei risultati di una left outer join include tutti i record di dati della tabella di sinistra così come quei record di dati della tabella di destra che sod­di­sfa­no la con­di­zio­ne di join. Solo i record di dati della tabella "auto" sono inclusi nei risultati del join che con­ten­go­no un valore nella colonna auto_id per il quale il DBMS trova un valore cor­ri­spon­den­te anche nella tabella "col­la­bo­ra­to­ri".

I valori mancanti nella tabella dei risultati vengono re­sti­tui­ti come valori zero.

N.B.

A dif­fe­ren­za delle inner join, l'ordine delle tabelle nella di­chia­ra­zio­ne SQL deve essere ri­spet­ta­to per le outer join. In una left join vengono re­sti­tui­ti com­ple­ta­men­te tutti i record di dati della tabella sinistra del­l'o­pe­ra­to­re join, mentre in una right join vengono emessi tutti i record di dati della tabella destra del­l'o­pe­ra­to­re join.

Come risultato della left outer join otteniamo la seguente tabella.

Tabella: left outer join tra le tabelle "col­la­bo­ra­to­ri" e "auto"

c_id cognome nome col­la­bo­ra­to­ri.auto_id auto.auto_id marca modello targa anno di co­stru­zio­ne revisione
1 Bianchi Maria 3 3 BMW X6 B MW 780 2017 01.09.2018
2 Rossi Giada 1 1 VW Caddy B KH 778 2016 18.12.2018
3 Padovan Gianluca 1 1 VW Caddy B KH 778 2016 18.12.2018
4 Terragna Eli­sa­bet­ta 2 2 Opel Astra B PO 654 2010 12.08.2019
5 Verdi Marco ZERO ZERO ZERO ZERO ZERO ZERO ZERO

La tabella dei risultati ha due pe­cu­lia­ri­tà:

il record di dati della tabella "auto" con auto_id 4 (Porsche Boxster) non appare nella tabella dei risultati. La ragione di ciò è che non esiste una chiave esterna adeguata nella tabella "col­la­bo­ra­to­ri" per una chiave primaria con il valore 4. La con­di­zio­ne di selezione non è sod­di­sfat­ta. Il record di dati deriva dalla tabella di output destra ed è quindi nascosto.

La chiave esterna auto_id della tabella di output "col­la­bo­ra­to­ri" contiene un valore zero per il record di dati del di­pen­den­te Marco Verdi. Pertanto, nella tabella "auto" non si trova nessuna chiave primaria cor­ri­spon­den­te. Anche in questo caso la con­di­zio­ne di selezione non è sod­di­sfat­ta. Tuttavia, poiché il record di dati deriva dalla tabella di output sinistra, questo è ancora incluso nella tabella dei risultati in una left join. I valori mancanti nella tupla della tabella dei risultati sono impostati su ZERO.

Right outer join SQL

La right outer join segue lo stesso principio della left outer join, ma la tabella dominante qui non è quella di sinistra, ma quella di destra.

Il risultato di una right outer join comprende tutte le tuple della tabella sul lato destro del­l'o­pe­ra­to­re join e le tuple della tabella sinistra che sod­di­sfa­no la con­di­zio­ne di join. Come operatore viene uti­liz­za­to il seguente simbolo: .

Ri­par­tia­mo dalle tabelle di output "col­la­bo­ra­to­ri" e "auto" e definiamo la stessa con­di­zio­ne di selezione per la right join come nel­l'e­sem­pio per la left join.

Algebra re­la­zio­na­le:

col­la­bo­ra­to­ri ⟖ auto_id=auto_idauto

Di­chia­ra­zio­ne SQL:

SELECT * FROM collaboratori RIGHT JOIN auto ON collaboratori.auto_id = auto.auto_id;

Tabella: right outer join tra le tabelle "col­la­bo­ra­to­ri" e "auto"

c_id cognome nome col­la­bo­ra­to­ri.auto_id auto.auto_id marca modello targa anno di co­stru­zio­ne revisione
1 Bianchi Maria 3 3 BMW X6 B MW 780 2017 01.09.2018
2 Rossi Giada 1 1 VW Caddy B KH 778 2016 18.12.2018
3 Padovan Gianluca 1 1 VW Caddy B KH 778 2016 18.12.2018
4 Terragna Eli­sa­bet­ta 2 2 Opel Astra B PO 654 2010 12.08.2019
ZERO ZERO ZERO 4 4 Porsche Boxter B AA 123 2018 23.12.2020

Il record di dati per il di­pen­den­te Marco Verdi non è contenuto nella tabella dei risultati. La ragione di ciò è che auto_id del record di dati cor­ri­spon­de al valore ZERO e quindi non può essere assegnato a nessun record di dati nella tabella di destra.

Come risultato della right join otteniamo tutti i record della tabella "auto", anche il record con valore auto_id cor­ri­spon­den­te a 4, a cui non è stata assegnata nessuna tupla della tabella "col­la­bo­ra­to­ri". I valori mancanti vengono emessi anche qui come valori zero.

Full outer join SQL

Una full outer join è una com­bi­na­zio­ne di left outer join e right outer join. Per il fun­zio­na­men­to nel­l'al­ge­bra re­la­zio­na­le è stato definito il seguente operatore: .

Il­lu­stria­mo anche la full join nelle tabelle di output "col­la­bo­ra­to­ri" e "auto" e partiamo dalla stessa con­di­zio­ne di selezione di prima.

Algebra re­la­zio­na­le:

col­la­bo­ra­to­ri ⟗ auto_id=auto_idauto

Di­cha­ra­zio­ne SQL:

SELECT * FROM collaboratori FULL JOIN auto ON collaboratori.auto_id = auto.auto_id;

Il risultato cor­ri­spon­de alla tabella seguente.

Tabella: full outer join per le tabelle "col­la­bo­ra­to­ri" e "auto"

c_id nome cognome col­la­bo­ra­to­ri.auto_id auto.auto_id marca modello targa anno di co­stru­zio­ne revisione
1 Bianchi Maria 3 3 BMW X6 B MW 780 2017 01.09.2018
2 Rossi Giada 1 1 VW Caddy B KH 778 2016 18.12.2018
3 Padovan Gianluca 1 1 VW Caddy B KH 778 2016 18.12.2018
4 Terragna Eli­sa­bet­ta 2 2 Opel Astra B PO 654 2010 12.08.2019
5 Verdi Marco ZERO ZERO ZERO ZERO ZERO ZERO ZERO
ZERO ZERO 4 Porsche Boxster B AA 123 2018 23.12.2020

La full join collega i record di dati delle tabelle di output in base alla con­di­zio­ne di selezione, ma non elenca solo i record di dati collegati nella tabella dei risultati, ma anche i record di dati di entrambe le tabelle che non sod­di­sfa­no la con­di­zio­ne di selezione.

Anche i valori mancanti nella full join sono con­tras­se­gna­ti con la dicitura “ZERO”.

N.B.

Le full outer join hanno poca im­por­tan­za nella prassi e non sono sup­por­ta­te da sistemi di gestione di database leader di mercato come MySQL e MariaDB

    ZERO

Natural outer join

Come le inner join, anche le outer join possono essere rea­liz­za­te come natural join. Gli operatori cor­ri­spon­den­ti sono:

LEFT/RIGHT JOIN ... USING

O:

NATURAL LEFT/RIGHT JOIN

Le natural outer join collegano le tabelle uti­liz­zan­do colonne con lo stesso nome. Le colonne se­le­zio­na­te possono essere definite espli­ci­ta­men­te uti­liz­zan­do la parola chiave USING:

SELECT * FROM collaboratori LEFT JOIN auto USING(auto_id);

In al­ter­na­ti­va, è possibile ricorrere a una notazione ab­bre­via­ta in cui il DMBS cerca au­to­ma­ti­ca­men­te le colonne con lo stesso nome e collega le tabelle elencate uti­liz­zan­do queste:

SELECT * FROM collaboratori NATURAL LEFT JOIN reparti;

Ri­fe­ren­do­si alle tabelle di esempio in­tro­dot­te sopra, entrambe le di­chia­ra­zio­ni SQL giungono allo stesso risultato.

c_id cognome nome auto_id marca modello targa anno di co­stru­zio­ne revisione
1 Bianchi Maria 3 BMW X6 B MW 780 2017 01.09.2018
2 Rossi Giada 1 VW Caddy B KH 778 2016 18.12.2018
3 Padovan Gianluca 1 VW Caddy B KH 778 2016 18.12.2018
4 Terragna Eli­sa­bet­ta 2 Opel Astra B PO 654 2010 12.08.2019
5 Verdi Marco ZERO ZERO ZERO ZERO ZERO ZERO

La natural left join combina le colonne col­la­bo­ra­to­ri.auto_id e auto.auto_id per formare la colonna comune auto_id.

Outer join nella prassi

Di solito le outer join portano a gruppi di tabelle con valori zero. Questo è utile, ad esempio, se si vogliono mettere in evidenza esat­ta­men­te questi valori. Nel nostro esempio, la Porsche Boxster non è ancora stata assegnata a nessun di­pen­den­te, cosa che non può essere desunta dalla tabella "auto". Anche la tabella "col­la­bo­ra­to­ri" mostra solo che Marco Verdi non utilizza ancora un'auto aziendale, e non quale sia quella di­spo­ni­bi­le. Dopo una full join tra entrambe le tabelle, è chiaro a colpo d'occhio che Marco potrebbe guidare la Porsche in futuro.

Vai al menu prin­ci­pa­le