13 – 14 inner join , natural join ed equi join

Finora abbiamo usato delle join che sono in realtà dei casi particolari di una categoria molto più ampia, la inner join.

intanto bisogna fare una distinzione tra INNER JOINS (Joins interne) e OUTER JOINS (joins esterne)

vediamo in SQL una forma minimale di join dove abbiamo 1 tabella comuni e 1 tabella vie che conterrà una chiave corrispondente alla chiave primaria del comune

select * from Comuni, vie
where Comuni.IDComune = Vie.ksComune

abbiamo estratto tutti record che soddisfano il criterio imposto : IDComune = ksComune.

Il fatto di aver utilizzato l’operatore di uguaglianza è solo 1 delle possibilità. Le inner joins sono quelle  per le quali si indica nel criterio di congiunzione un certo predicato, magari quello con l’uguale e questo è appunto soddisfatto .

EQUI JOIN

where Comuni.IDComune = Vie.ksComune

Questo comando SQL ricade proprio nelle categoria delle EQUI JOINS che come suggerisce il nome sono quelle joins interne il cui criterio da soddisfare è il criterio di uguagianza. Vediamo nel particolare:

select * from Comuni, vie 
where Comuni.IDComune = Vie.ksComune and nomeComune = 'Milano' ;

è difficile distinguere i tipi di joins tra la congiunzione (Comuni.IDComune = Vie.ksComune) e i vincoli supplementari che potremmo imporre (nomeComune = ‘Milano’). Infatti il primo confronto serve ad indicare come gestire le tabelle nel loro insieme, il secondo invece. dal risultato ottenuto applica un filtro. Quindi per scopi diversi e in momenti diversi, eppure dal punto di vista sintattico non si riesce a distinguere qual’è l’una e qual’è l’altra. Spesso si da per scontata la prima congiunzione, omettendola, perché a mente si unisce la tabella Comuni con vie, commettendo un errore. Esiste un forma per scrivere lo stesso comando di prima

select * from Comuni inner join vie on IDComune = ksComune
where nomeComune = 'Milano' ;

in questo modo congiungo le 2 tabelle senza errore

Comuni inner join vie

e applico il criterio col predicato ON

on IDComune = ksComune

NATURAL JOIN

Le natural join sono un caso particolare delle equi join:

select * from Comuni, vie 
where Comuni.IDComune = Vie.IDComune

La particolarità è che il nome del campo è lo stesso (non c’è più ksComune) ed è proprio la situazione della natural join, ovvero stiamo congiungendo 2 tabelle sulla base dell’uguaglianza di 2 campi di ogni tabella che hanno lo stesso nome (IDComune). Si può scrivere nella sua sintassi:

select * from Comuni natural join vie

Non servirà scrivere altro, penserà il sistema ad effettuare la congiunzione where in automatico. Unica clausola è che non vi sia ambiguità, ovvero non vi siano più di 2 campi con lo stesso nome. Quindi la natural join è identica alla equi join, ma si pretende che i noi dei campi da confrontare abbiano lo stesso nome.

THETA JOIN

Caso pratico: abbiamo una tabella modelli contenete i campi id, modello, anno.

Vogliamo estrarre tutti i modelli di auto prodotti in data successiva ad un certo modello che chiamiamo fiesta

select tab1.modello, tab2.modello
from modelli as tab1 INNER JOIN modelli as tab2 ON tab1.anno < tab2.anno
and tab1.modello = 'fiesta';

In questo caso abbiamo una sola tabella da congiungere con se stessa (self join), congiungo la tabella (tab1) e la copia di se stessa e la parte che confronta, tab1.anno < tab2.anno è una theta join, in quanto il predicato di confronto è un minore e non un uguale. La parte finale, and tab1.modello = ‘fiesta’ vincola  tab1.modello ad essere sostituito con fiesta, quindi nella theta join è come se scrivessi  ON anno di fiesta < tab2.anno.

Riassumendo:

la theta join è sempre una inner join dove rilasciamo il vincolo sull’operatore o predicato di confronto che non è necessariamente quello di eguaglianza (altrimenti saremmo in una equi join o al limite una natural join), ma è uno qualsiasi come il minore, il maggiore, il minore e uguale, il diverso…