Join in SQL
Nel linguaggio SQL l'operazione di Join combina le righe di due o più tabelle in base ai valori contenuti nelle colonne.
Mi permette di affiancare le colonne di due o più tabelle in base a una condizione di join implicita o esplicita.
Join implicito
Posso realizzare l'operazione di Join in modo implicito, indicando la condizione di Join nella clausola WHERE della SELECT.
SELECT * FROM tab1, tab2
WHERE tab1.colonna = tab2.colonna
Join esplicito
In alternativa posso effettuare l'operazione di Join in modo esplicito, detta INNER JOIN, indicando la condizione di Join nella clausola FROM con gli operatori JOIN e ON. La parola INNER è facoltativa.
SELECT *
FROM tab1 JOIN tab2
ON tab1.colonna= tab2.colonna
Il risultato finale è sempre lo stesso.
Il join produce una tabella con le righe delle tabelle che rispettano la condizione di join.
Nota. Questo tipo di join è detto join interno ( INNER JOIN ). Equivale al Theta Join dell'algebra relazionale. Una versione particolare del join è il join esterno ( OUTER JOIN ) che combina tutte le righe di una tabella con i dati dell'altra che rispettano la condizione di join.
Un esempio pratico
Ho due tabelle Persone e Paternità.
Devo visualizzare una tabella in cui per ciascuna persona compaia il suo reddito e il nome di suo padre.
Posso realizzare la tabella con un join implicito
SELECT Nome, Reddito, Padre
FROM Persone T1, Paternità T2
WHERE T1.Nome=T2.Figlio
oppure con un join esplicito
SELECT Nome, Reddito, Padre
FROM Persone JOIN Paternità
ON Nome=Figlio
Entrambe le interrogazioni producono la seguente tabella di join.
Nota. Nella tabella di join scompaiono le righe relative al reddito di Mario e Giovanni della tabella Persone, perché questi nomi non compaiono nella colonna Figli della tabella Paternità. Quindi, la condizione di join non è soddisfatta. Per visualizzare tutti i nomi e i redditi delle persone, anche se non c'è l'informazione sul padre, devo usare un join esterno sinistro (LEFT OUTER JOIN). Vedi l'esempio alla fine di questi appunti.
Tipi di Join
Esistono quattro tipi di Join
- INNER JOIN
Combina le righe delle tabelle che soddisfano la condizione di join. La parola INNER è facoltativa. E' l'operazione di Join di default già vista nell'esempio precedente.
- LEFT OUTER JOIN
E' un join esterno che completa tutte le righe della prima tabella con le righe della seconda tabella che soddisfano la condizione di join. Le righe della prima tabella senza corrispondenza nella seconda sono estese con valori nulli. La parola OUTER è facoltativa.
- RIGHT OUTER JOIN
E' un join esterno che completa tutte le righe della seconda tabella con le righe della prima tabella che soddisfano la condizione di join. Le righe della seconda tabella senza corrispondenza nella prima sono estese con valori nulli. La parola OUTER è facoltativa.
- FULL OUTER JOIN
E' un join esterno che include tutte le righe della prima e della seconda tabella con il Right Join e il Left Join. La parola OUTER è facoltativa.
Il Join esterno (OUTER JOIN)
Il join esterno ( OUTER JOIN ) mi permette di mantenere tutte le righe di una tabella o entrambe le tabelle.
Esistono tre versioni del join esterno:
- LEFT OUTER JOIN
Mantiene tutte le righe della prima tabella a cui aggiunge le righe della seconda che soddisfano la condizione di join. - RIGHT OUTER JOIN
Mantiene tutte le righe della seconda tabella a cui aggiunge le righe della prima che soddisfano la condizione di join. - FULL OUTER JOIN
E' la combinazione del LEFT e RIGHT OUTER JOIN. Mantiene tutte le tuple di entrambe le tabelle, estendendole con valori nulli se necessario.
Un esempio pratico
Ho due tabelle Persone e Paternità.
Voglio mostrare il nome, il reddito e, se presente, il nome del padre della persona.
Per non escludere le righe della prima tabella senza corrispondenza nella seconda utilizzo il LEFT OUTER JOIN.
SELECT Nome, Reddito, Padre
FROM Persone LEFT JOIN Paternità
ON Nome=Figlio
Il qualificatore OUTER è facoltativo. Per questa ragione nella query c'è soltanto LEFT JOIN.
Il join esterno genera una tabella in output con tutti i record della prima tabella.
L'informazione sul padre viene aggiunta soltanto se è presente.
Nota. A differenza del join interno (INNER JOIN) il join esterno (OUTER JOIN) non esclude le righe senza corrispondenza nell'altra tabella. In questo caso, essendo una interrogazione del tipo LEFT OUTER JOIN, mostra tutte le righe della prima tabella. Si vedono anche le righe relative al reddito di Mario e Giovanni della tabella Persone.
Il join naturale (NATURAL JOIN)
Il join naturale ( NATURAL JOIN ) combina due o più tabelle usando le colonne con lo stesso nome e tipo di dato.
Il join naturale è presente nella versione SQL-2.
E' però sconsigliabile usarlo perché il suo comportamento non è sempre controllabile.
Attenzione. Se le due tabelle non hanno una colonna in comune, il natural join effettua il prodotto cartesiano delle due tabelle. Il risultato è una tabella molto grande in cui ogni riga di una tabella è combinata con tutte le righe dell'altra tabella.
Un esempio pratico
Ho due tabelle Persone e Paternità.
La prima e la seconda tabella hanno una colonna in comune (Nome).
Scrivo un'interrogazione usando il Join naturale ( NATURAL JOIN ) .
SELECT * FROM Persone NATURAL JOIN Paternità;
Nel caso del join naturale non va specificata la condizione di Join.
Il natural join verifica automaticamente se esistono colonne con lo stesso nome nelle due tabelle. In questo caso la colonna Nome.
Poi seleziona le righe delle tabelle che hanno lo stesso valore.
Il risultato finale è uguale all'inner join.
Nota. Il natural join elimina automaticamente una delle due colonne uguali perché sarebbe ridondante. Per questa ragione nel risultato viene mostrata soltanto una colonna nome.
E così via.