Left Join, Right Join, Full Join Consideriamo il solito schema di database dell'ultima verifica. Ipotizziamo inoltre che tra le due relazioni sia impostato un vincolo di Integrità Referenziale. Modello concettuale Modello logico Studenti(cognome, nome, siglac, annonascita) ClassiScol(siglaC, aula, piano) In corsivo la chiave esterna, sottolineata la chiave primaria Studenti Pag. 1/6
ClassiScol Osservazioni 1) Nella tabella degli studenti vi sono due studenti che non appartengono a nessuna classe (contrassegnate da valori NULL): il primo e il terzultimo. 2) Non vi sono studenti appartenenti alle classi 5M e 5N Join Naturale (Inner Join) Sappiamo che nel join naturale compaiono tutte le tuple che si ottengono concatenando ogni tupla della prima relazione con ogni tupla della seconda relazione che hanno lo stesso valore negli attributi comuni, quindi si ignorano tuple appartenenti alla tabella Studenti che non sono stati assegnati ad alcuna classe e viceversa si ignorano classi a cui non corrispondono studenti. Usando gli operatori dell'algebra relazionale, scriviamo Studenti >< ClassiScol In MySQL, ci sono molti modi per scrivere il Join Naturale 1) SELECT * JOIN classi_tbl AS c ON s.siglac = c.siglac 2) SELECT * INNER JOIN classi_tbl AS c ON s.siglac = c.siglac 3) SELECT *, classi_tbl AS c WHERE s.siglac = c.siglac In tutti e tre i casi, l'attributo siglac è ripetuto 2 volte Pag. 2/6
La relazione risultante è sempre la seguente: Dal momento che comunque i nomi degli attributi chiave primaria e chiave esterna coincidono, il Natural Join può essere scritto più semplicemente come 4) SELECT * FROM studenti_tbl NATURAL JOIN classi_tbl senza avere più la necessità di assegnare un alias alle relazioni (clausola AS). In più il vantaggio è che il campo chiave (esterno o interno) appare una sola volta. Purtroppo non tutti i database supportano il Join Naturale nella forma precedente. Join esterno Nel join esterno compaiono nel risultato tutte le tuple di una relazione anche se non ci sono tuple corrispondenti nell'altra. Pag. 3/6
Abbiamo 3 tipi di join esterno: 1) Left join 2) Right join 3) Full join Left Join Il left join (join sinistro) estende solo le tuple del primo operando: nel risultato compaiono tutte le tuple della prima relazione e solo quelle della seconda che hanno un valore corrispondente In MySQL: SELECT * LEFT JOIN classi_tbl AS c ON s.siglac = c.siglac Scriviamo usando gli operatori dell'algebra relazionale Risultato: Studenti >< LEFT ClassiScol Notiamo la presenza dell'attributo siglac che appare due volte. Per eliminarlo occorrebbe effettuare una proiezione della relazione appena ottenuta. Notiamo inoltre che il database MySQL completa inserendo dei valori NULL gli attributi numstud e aula nelle tuple degli studenti che non appartenevano ad alcuna classe (siglac = NULL). In maniera analoga scriviamo Right Join Studenti >< RIGHT ClassiScol Pag. 4/6
In MySQL: SELECT * RIGHT JOIN classi_tbl AS c ON s.siglac = c.siglac Le righe ottenute nella nuova relazione comprendono tutte le classi, anche quelle per cui non esistono studenti corrispondenti. Risultato: Anche in questo caso, il database inserisce nelle due ultime tuple della relazione risultante dei valori NULL. Scriviamo Full Join Studenti >< FULL ClassiScol Nella tabella risultante comparirebbero tutti gli studenti e tutte le classi. Purtroppo MySQL non dispone di un comando diretto (come potrebbe essere il seguente SELECT * FULL JOIN classi_tbl AS c ON s.siglac = c.siglac Tuttavia possiamo usare una Union per simulare il comportamento di una Full Join (SELECT * LEFT JOIN classi_tbl AS c ON s.siglac = c.siglac) UNION (SELECT * RIGHT JOIN classi_tbl AS c ON s.siglac = c.siglac) Pag. 5/6
Ecco il risultato: Pag. 6/6