Ti è mai capitato di voler unire due o più tabelle e non ottenere il risultato sperato? In questo articolo cerchiamo di spiegare le join con gli insiemi.
Prendi due tabelle A e B
tabella A
|
tabella B
|
e immagina che siano 2 insiemi
|
Intersecando i due insiemi otteniamo una zona condivisa (verde) e due aree separate (gialla e azzurra), i diversi tipi di join si occupano di selezionare queste aree estrapolando diversi gruppi di risultati.
INNER JOIN
In base all'esistenza o meno della condizione (WHERE), la inner join restituisce solo i record verificati esistenti in entrambe le tabelle, tutte quelle righe che non hanno corrispondenza verranno escluse.
Per fare un esempio pensiamo una query di questo tipo:
SELECT * FROM tabellaA INNER JOIN tabellaB ON tabellaA.id_dipartimento = tabellaB.id
Il risultato è:
id | dipartimento | nome | id_dipartimento |
---|---|---|---|
1 | architettura | Gino | 1 |
2 | economia | Pino | 2 |
3 | storia | Maria | 3 |
5 | filosofia | Rosa | 5 |
Il dipartimento di scienze non ha iscritti, quindi non è stato considerato. Nel caso degli insiemi viene preso in considerazione solo la porzione che si sovrappone.
OUTER JOIN
La outer join restituisce tutti i record che non corrispondono alle chiavi di ricerca. E' il contrario della inner join.
Questo è solo un concetto, perchè verrebbero estratti solo risultati non corrispondenti visualizzati con una serie di NULL. In realtà si usa insieme a left o right diventando left outer join o right outer join.
Nel caso degli insiemi viene selezionato tutto quello che sta al di fuori dall'intersecazione.
LEFT OUTER JOIN (RIGHT OUTER JOIN)
Questo tipo di selezione si ottiene mettendo insieme il concetto di inner join e outer join. Il risultato che si ottiene è la selezione di tutti i record della tabella A che corrispondono con la tabella B, più i record della tabella A che non corrispondono. I record che non corrispondono vengono valorizzati a NULL
Esiste anche la right outer join ma normalmente non si usa e per ottenere lo stesso risultato si cambia l'ordine delle tabelle. A volte è possibile omettere il termine OUTER, quindi rimane semplicemente LEFT o OUTER JOIN
Vediamo l'esempio
SELECT * FROM tabellaA LEFT JOIN TabellaB ON tabellaA.id_dipartimenti = tabellaB.id
Il risultato è:
id | dipartimento | nome | id_dipartimento |
---|---|---|---|
1 | architettura | Gino | 1 |
2 | economia | Pino | 2 |
3 | storia | Maria | 3 |
4 | scienze | NULL | NULL |
5 | filosofia | Rosa | 5 |
In questo caso anche la riga "scienze" è stata inserita,ma dal momento che non ci sono iscritti viene inserito NULL nel campi non corrispondenti.
Il disegno con gli insiemi appare così:
Commenti offerti da CComment