La JOIN è una clausola del linguaggio SQL che serve a combinare le tuple di due o più relazioni di una base di dati. Lo standard ANSI definisce alcune specifiche per il linguaggio SQL sul tipo di JOIN da effettuare: , , e , alle quali diversi DBMS aggiungono . In alcuni casi è possibile che una tabella possa essere combinata con se stessa, in questo caso si parlerà di self-join.

Tabelle di esempio Tutti gli esempi che verranno riportati di seguito faranno uso delle seguenti due tabelle:

+ Tabella Impiegati Cognome ID_dipartimento Rossi 31 Bianchi 33 Mancini 33 Santoro 34 Monti 34 Grassi

+ Tabella Dipartimenti ID_dipartimento Nome_dipartimento 31 Vendite 33 Tecnico 34 Risorse umane 35 Promozione

Dipartimenti.ID_dipartimento è la chiave primaria che ha una cardinalità 0:n nei confronti del campo Impiegati.ID_dipartimento.

Nota: Il dipartimento Promozione della tabella Dipartimenti non ha alcuna corrispondenza nella tabella Impiegati. Mentre l'impiegato Grassi non è stato assegnato ad alcun dipartimento (NULL).

Inner join Una crea una nuova tabella combinando i valori delle due tabelle di partenza ( e ) basandosi su una certa regola di confronto. La query compara ogni riga della tabella con ciascuna riga della tabella cercando di soddisfare la regola di confronto definita. Quando la regola di join viene soddisfatta, i valori di tutte le colonne delle tabelle e vengono combinate in un'unica riga nella costruzione della tabella risultante. La è la forma di join usata più di frequente nelle applicazioni e rappresenta la modalità predefinita.

Per esempio, la seguente query unirà le due tabelle Impiegati e Dipartimenti usando la chiave primaria ID_dipartimento che è la colonna presente in entrambe le tabelle. Quando ID_dipartimento corrisponde in entrambe le tabelle (ovvero la regola è soddisfatta), la query combinerà le colonne Cognome, ID_dipartimento e Nome_dipartimento in un'unica riga per la tabella risultante.

Esempio di in forma esplicita:

SELECT * FROM Impiegati INNER JOIN Dipartimenti ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

che equivale a:

SELECT * FROM Impiegati, Dipartimenti WHERE Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

Risultato della query di :

Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento Santoro 34 Risorse umane 34 Bianchi 33 Tecnico 33 Monti 34 Risorse umane 34 Mancini 33 Tecnico 33 Rossi 31 Vendite 31

Nota: l'impiegato Grassi e il dipartimento Promozione non sono presenti in quanto l'impiegato Grassi ha un mentre Promozione non compare in nessun impiegato. A volte come risultato finale si desidera avere anche i record che non hanno corrispondenza: in tal caso è possibile usare la query di tipo .

Equi-join La equi-join, noto come "l'unica operazione ammissibile", ha un particolare tipo di comparatore, detto theta join, che utilizza come metodo di verifica, solamente l'uguaglianza matematica come regola di confronto. Usare altri operatori di confronto (come ad esempio ) squalifica la join come equi-join. La query riportata di seguito utilizza una equi-join:

SELECT * FROM Impiegati INNER JOIN Dipartimenti ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

SQL fornisce una scorciatoia per definire le equi-joins, attraverso la parola riservata

SELECT * FROM Impiegati INNER JOIN Dipartimenti USING (ID_dipartimento)

La keyword è supportata da Microsoft SQL Server Management Studio, MySQL, Oracle, PostgreSQL, SQLite, e DB2/400.

Natural join Una offre ulteriori specializzazioni di equi-join. Solitamente la confronta colonne di tabelle diverse che hanno lo stesso nome. La fa proprio questo.

Nell'esempio che segue viene riportata la notazione equivalente alla prima definita:

SELECT * FROM Impiegati NATURAL JOIN Dipartimenti

ID_dipartimento Impiegati.Cognome Dipartimenti.Nome_dipartimento 34 Monti Risorse umane 33 Bianchi Tecnico 34 Santoro Risorse umane 33 Mancini Tecnico 31 Rossi Vendite

Cross join

Una , cartesian join o product fornisce le basi (le infrastrutture informatiche) attraverso cui tutti i tipi di operano. Il risultato di una è il prodotto cartesiano di tutte le righe delle tabelle che concorrono alla query di join. È come dire che stiamo facendo una senza impostare la regola di confronto o in cui la regola di confronto ritorna sempre vero.

Date le due tabelle di partenza e , la cross join si scrive × .

Esempio di esplicito:

SELECT * FROM Impiegati CROSS JOIN Dipartimenti

Altro esempio implicito di :

SELECT * FROM Impiegati, Dipartimenti;

Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento Rossi 31 Vendite 31 Bianchi 33 Vendite 31 Mancini 33 Vendite 31 Monti 34 Vendite 31 Santoro 34 Vendite 31 Grassi Vendite 31 Rossi 31 Tecnico 33 Bianchi 33 Tecnico 33 Mancini 33 Tecnico 33 Monti 34 Tecnico 33 Santoro 34 Tecnico 33 Grassi Tecnico 33 Rossi 31 Risorse umane 34 Bianchi 33 Risorse umane 34 Mancini 33 Risorse umane 34 Monti 34 Risorse umane 34 Santoro 34 Risorse umane 34 Grassi Risorse umane 34 Rossi 31 Promozione 35 Bianchi 33 Promozione 35 Mancini 33 Promozione 35 Monti 34 Promozione 35 Santoro 34 Promozione 35 Grassi Promozione 35

Outer join Una non richiede che ci sia corrispondenza esatta tra le righe di due tabelle. La tabella risultante da una outer join trattiene tutti quei record che non hanno alcuna corrispondenza tra le tabelle. Le si suddividono in , , e , in base a quale sia la tabella di cui intendiamo trattenere i valori in caso di mancata corrispondenza della regola di confronto da (sinistra, destra, o entrambi). In questo caso left (sinistra) e right (destra) si riferiscono ai due lati della keyword .

Nota sulle clausole WHERE e ON Si sottolinea come esista un ordine di esecuzione tra le condizioni specificate nella e quelle presenti nella .

Specificatamente le clausole presenti nella sono valutate anteriormente all'esecuzione della mentre le clausole nella sono valutate successivamente all'esecuzione della .

Left outer join Il risultato di una query (o semplicemente ) per le tabelle e contiene sempre tutti i record della tabella di sinistra (left) , mentre vengono estratti dalla tabella di destra (right) solamente le righe che trovano corrispondenza nella regola di confronto della join. Questo significa che se la clausola trova zero righe in , la mostrerà una riga risultante con valore in tutte le colonne corrispondenti al risultato per le colonne di .

Esempio di una left outer join:

SELECT * FROM Impiegati LEFT OUTER JOIN Dipartimenti ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento Bianchi 33 Tecnico 33 Rossi 31 Vendite 31 Santoro 34 Risorse umane 34 Monti 34 Risorse umane 34 Grassi Mancini 33 Tecnico 33

Right outer join Una (o ) semplicemente ricalca il funzionamento della , ma invertendo l'ordine delle tabelle interessate.

Il risultato di una query per le tabelle e contiene sempre tutti i record della tabella di destra (right) , mentre vengono estratti dalla tabella di sinistra (left) solamente le righe che trovano corrispondenza nella regola di confronto della . Questo significa che se la clausola trova zero righe in , la mostrerà una riga risultante con valore in tutte le colonne corrispondenti al risultato per le colonne di .

Esempio di una :

SELECT * FROM Impiegati RIGHT OUTER JOIN Dipartimenti ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento Monti 34 Risorse umane 34 Bianchi 33 Tecnico 33 Santoro 34 Risorse umane 34 Mancini 33 Tecnico 33 Rossi 31 Vendite 31 Promozione 35

In pratica sono utilizzate maggiormente le query di rispetto a quelle di , ma possono verificarsi rari casi in cui in query molto complesse ci sia la necessità di utilizzare contemporaneamente il criterio di e di .

Lo stesso risultato della precedente si può ripetere usando il tipo :

SELECT * FROM Dipartimenti LEFT OUTER JOIN Impiegati ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

Full outer join Una combina i risultati delle due tabelle e tenendo conto di tutte le righe delle tabelle, anche di quelle che non hanno corrispondenza tra di loro.

Il risultato di una query per le tabelle e contiene sempre tutti i record della tabella di sinistra (left) , estraendo dalla tabella di destra (right) solamente le righe che trovano corrispondenza nella regola di confronto della join; inoltre verranno estratti tutti i record della tabella di sinistra (left) che non trovano corrispondenza nella tabella di destra (right) impostando a i valori di tutte le colonne della tabella e tutti i record della tabella di destra (right) che non trovano corrispondenza nella tabella di sinistra (left) impostando a i valori di tutte le colonne della tabella .

Esempio di una :

SELECT * FROM Impiegati FULL OUTER JOIN Dipartimenti ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento Monti 34 Risorse umane 34 Bianchi 33 Tecnico 33 Santoro 34 Risorse umane 34 Grassi Mancini 33 Tecnico 33 Rossi 31 Vendite 31 Promozione 35

Alcuni database (come per esempio MySQL) non supportano direttamente questa funzionalità, ma la si può emulare attraverso la combinazione di e per mezzo della parola riservata .

La creazione di una query di si realizzerà come segue:

SELECT * FROM Impiegati LEFT JOIN Dipartimenti ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento UNION SELECT * FROM Impiegati RIGHT JOIN Dipartimenti ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento WHERE Impiegati.ID_dipartimento IS NULL

Allo stesso modo senza utilizzare nemmeno la query di :

SELECT Impiegati.*, Dipartimenti.* FROM Impiegati LEFT JOIN Dipartimenti ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento UNION SELECT Impiegati.*, Dipartimenti.* FROM Dipartimenti LEFT JOIN Impiegati ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento WHERE Impiegati.ID_dipartimento IS NULL

Self-join La self-join serve a unire una tabella con se stessa.

Voci correlate Sort merge join SQL

Altri progetti

Collegamenti esterni

Categoria:SQL