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à.

due tabelle di esempio

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.

la 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.
    la rappresentazione dell'INNER JOIN
  • 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.
    la rappresentazione del LEFT OUTER JOIN
  • 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.
    la rappresentazione del RIGHT OUTER JOIN
  • 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.
    la rappresentazione del FULL OUTER JOIN

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à.

due tabelle di esempio

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.

un esempio di LEFT OUTER JOIN

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).

esempio di tabelle

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.

il risultato del join naturale

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.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base

SQL