Per eseguire delle query tra più tabelle di database nel modello di database re­la­zio­na­le uti­liz­za­te i join SQL. Ad eccezione della cross join, tutti i tipi di join sono una com­bi­na­zio­ne di un prodotto car­te­sia­no e di una selezione.

Il Database Ma­na­ge­ment System (DBMS) è un'unione in­cro­cia­ta di due tabelle di database, che filtra il risultato secondo una con­di­zio­ne di selezione definita dal­l'u­ten­te uti­liz­zan­do una di­chia­ra­zio­ne SQL. L'inner join si distingue da tutti gli altri tipi di join per il suo fornire un risultato minimale. Il risultato di una inner è co­sti­tui­to solamente dai record di dati del­l'u­nio­ne in­cro­cia­ta che sod­di­sfa­no la con­di­zio­ne di selezione. Il risultato è una tabella dei risultati (una View) senza valori zero.

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

Utilizzo pratico delle inner join

Il­lu­stre­re­mo l'inner join con un esempio, partendo da due tabelle. La tabella “col­la­bo­ra­to­ri” comprende i di­pen­den­ti di un'a­zien­da com­pren­si­vi di ID (c_id) e il cor­ri­spon­den­te reparto (r_id).

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

c_id cognome nome r_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 mostra due pe­cu­lia­ri­tà: i col­la­bo­ra­to­ri Rossi e Padovan lavorano nello stesso reparto. Il di­pen­den­te Verdi non è stato ancora assegnato a un reparto.

La tabella “reparti” elenca tutti i reparti del­l'a­zien­da, compresi ID e ubi­ca­zio­ne.

Tabella: reparti

r_id de­no­mi­na­zio­ne città
1 Di­stri­bu­zio­ne Roma
2 IT Milano
3 Personale Firenze
4 Ricerca Milano

Entrambe le tabelle sono collegate da una relazione a chiave esterna. L'ID del reparto, che funge da chiave primaria nella tabella “reparti”, è stato integrato come chiave esterna nella tabella “col­la­bo­ra­to­ri”.

Questo col­le­ga­men­to ci permette di avere una inner join in entrambe le tabelle. Ciò è ne­ces­sa­rio, ad esempio, per de­ter­mi­na­re dove un col­la­bo­ra­to­re stia lavorando.

Quando si in­ter­ro­ga­no database re­la­zio­na­li, la cor­ri­spon­den­za tra la chiave primaria e la chiave esterna viene so­li­ta­men­te definita come con­di­zio­ne di selezione. La con­di­zio­ne si considera sod­di­sfat­ta se la chiave esterna se­le­zio­na­ta di una tabella cor­ri­spon­de alla chiave primaria del­l'al­tra tabella (=). Ciò significa che vengono re­sti­tui­ti solo i record di dati che con­ten­go­no valori comuni.

Una inner join simile è annotata nell'algebra re­la­zio­na­le come segue.

col­la­bo­ra­to­ri⋈r_id=r_idreparti

Tuttavia, i sistemi di database re­la­zio­na­li non accettano comandi nella sintassi del­l'al­ge­bra re­la­zio­na­le, ma sotto forma di di­chia­ra­zio­ni SQL.

SELECT * FROM collaboratori INNER JOIN reparti ON collaboratori.r_id = reparti.r_id;

Il comando SELECT ordina al DBMS di re­cu­pe­ra­re i dati dal database. In al­ter­na­ti­va, SQL consente di inserire (INSERT INTO), di mo­di­fi­ca­re (UPDATE) o can­cel­la­re (DELETE FROM) i dati. Il comando SELECT è seguito dalla spe­ci­fi­ca­zio­ne di quali dati devono essere re­cu­pe­ra­ti. Poiché vogliamo re­cu­pe­ra­re il record di dati completo, se­le­zio­nia­mo un se­gna­po­sto cor­ri­spon­den­te: l'a­ste­ri­sco (*).

Il comando SELECT richiede sempre la parola chiave FROM e la spe­ci­fi­ca­zio­ne della tabella o del gruppo di tabelle (JOIN) da cui devono essere re­cu­pe­ra­ti i dati. Nel nostro caso, l'origine dei dati è una inner join tra le tabelle “reparti” e “col­la­bo­ra­to­ri”. Uti­liz­zia­mo anche la parola chiave ON per spe­ci­fi­ca­re una con­di­zio­ne per il col­le­ga­men­to. Vogliamo solo collegare i record di dati e produrli come tabella dei risultati in cui r_id della tabella “col­la­bo­ra­to­ri” cor­ri­spon­de a r_id della tabella “reparti”.

Consiglio

Visto che l'inner join è il join SQL più im­por­tan­te, se ne­ces­sa­rio potete omettere la parola chiave “inner”.

Una inner join tra le due tabelle di output con la con­di­zio­ne col­la­bo­ra­to­ri.r_id = reparti.r_id re­sti­tui­sce la seguente tabella dei risultati.

Tabella: inner join SQL tra “col­la­bo­ra­to­ri” e “reparti”

c_id cognome nome col­la­bo­ra­to­ri.r_id reparti.r_id de­no­mi­na­zio­ne città
1 Bianchi Maria 3 3 Personale Firenze
2 Rossi Giada 1 1 Di­stri­bu­zio­ne Roma
3 Padovan Gianluca 1 1 Di­stri­bu­zio­ne Roma
4 Terragna Eli­sa­bet­ta 2 2 IT Milano

Se si confronta la tabella dei risultati con le due tabelle di output, si noterà che manca un record di dati per ogni tabella. Si tratta di quei record di dati che nella colonna r_id non con­ten­go­no un valore cor­ri­spon­den­te a quelli presenti nella relativa tabella.

(5, Verdi, Marco, Zero)

e

(4, Ricerca, Milano)

Il di­pen­den­te Verdi non è ancora stato assegnato a un reparto. Non sono ancora stati assegnati col­la­bo­ra­to­ri al reparto di ricerca. Entrambi i record di dati sono perciò esclusi da una inner join, che ha lo scopo di fornire un confronto tra i di­pen­den­ti e i ri­spet­ti­vi reparti.

Se, invece, vogliamo rilevare esat­ta­men­te tali ir­re­go­la­ri­tà e renderle visibili nel­l'in­ter­ro­ga­zio­ne, dovremmo scegliere una outer join al posto di una inner join.

Sot­to­ca­te­go­rie di inner join

Le inner join si possono rea­liz­za­re sotto forma di theta join, equi join, non equi join e natural join.

Theta join, equi join e non equi join

L'inner join della ter­mi­no­lo­gia SQL cor­ri­spon­de al theta join del­l'al­ge­bra re­la­zio­na­le. La theta join si dif­fe­ren­zia da equi join e non equi join, in quanto fornisce agli utenti un numero il­li­mi­ta­to di operatori di confronto tra cui scegliere. Le equi join, invece, limitano la con­di­zio­ne di selezione per le query sul­l'u­gua­glian­za dei valori delle colonne. Le non equi join, invece, ammettono tutti gli operatori di confronto ad eccezione del segno uguale.

Tipo di join Operatori di confronto ammessi
Theta join = (uguale) < (minore) > (maggiore)≤ (minore o uguale)≥ (maggiore o uguale)<> (diseguale)!= (diseguale)
Equi join = (uguale)
Non equi join < (minore) > (maggiore)≤ (minore o uguale)≥ (maggiore o uguale)<> (diseguale)!= (diseguale)

Natural join

Se due tabelle (come negli esempi pre­ce­den­ti) sono collegate da colonne con lo stesso nome, le inner join vengono so­li­ta­men­te con­ver­ti­te in natural join.

Le natural join sono una sot­to­ca­te­go­ria di equi join. Come anche l'equi join, la natural join prevede l'u­gua­glian­za dei valori delle due colonne come con­di­zio­ne di selezione.

Una natural inner join tra le tabelle “col­la­bo­ra­to­ri” e “reparti” potrebbe, ad esempio, essere im­ple­men­ta­ta nel modo seguente:

SELECT * FROM collaboratori INNER JOIN reparti USING(r_id);

La di­chia­ra­zio­ne SQL indica al DBMS di collegare le tabelle elencate. La con­di­zio­ne di selezione viene im­ple­men­ta­ta usando la parola chiave USING, che specifica quali colonne devono essere con­trol­la­te per l'u­gua­glian­za. Il pre­re­qui­si­to è che in entrambe le tabelle esista una colonna r_id. I record di dati di entrambe le tabelle sono inclusi nel set di risultati solo se il DBMS trova valori identici nelle colonne designate con r_id.

Anche la tabella dei risultati della natural join si dif­fe­ren­zia da quella della classica inner join, in quanto le colonne con lo stesso nome nelle tabelle di output non sono elencate due volte, ma vengono unite in una colonna comune.

Tabella: natural join tra “col­la­bo­ra­to­ri” e “reparti”

c_id cognome nome r_id de­no­mi­na­zio­ne città
1 Bianchi Maria 3 Personale Firenze
2 Rossi Giada 1 Di­stri­bu­zio­ne Roma
3 Padovan Gianluca 1 Di­stri­bu­zio­ne Roma
4 Terragna Eli­sa­bet­ta 2 IT Milano

Invece di elencare gli ID di reparto di entrambe le tabelle due volte sia in col­la­bo­ra­to­ri.r_id che in reparti.r_id, viene vi­sua­liz­za­ta una sola colonna r_id.

Per le natural join è di­spo­ni­bi­le una notazione ab­bre­via­ta che non richiede una clausola USING. Si utilizza invece l'o­pe­ra­to­re natural join. La notazione ab­bre­via­ta indicata sopra cor­ri­spon­de alla seguente di­chia­ra­zio­ne SQL.

SELECT * FROM collaboratori NATURAL JOIN reparti;

L'o­pe­ra­to­re natural join collega au­to­ma­ti­ca­men­te le tabelle uti­liz­zan­do colonne con lo stesso nome. La con­di­zio­ne di selezione non deve essere definita espli­ci­ta­men­te.

N.B.

Una natural join viene im­ple­men­ta­ta au­to­ma­ti­ca­men­te come inner join. Se, invece, volete im­ple­men­ta­re una outer join come natural join, sono ne­ces­sa­rie parole chiave ag­giun­ti­ve (ad esempio una natural left outer join).

Vai al menu prin­ci­pa­le