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…