
Ancora dubbi? Suggerimenti?
Tipi di JOIN
Capita di vedere nelle query generate automaticamente o scritte da altri cose come
INNER JOIN,
LEFT JOIN,
FULL JOIN. Ma cosa significano queste diciture?
INNER JOIN
INNER JOIN è una clausola che fa corrispondere ad un elemento di una tabella un elemento uguale in un'altra tabella. Per esempio, se esistono una tabella di regioni e una di province, è possibile associare un identificativo di regione all'identificativo della provincia:
Regioni | ID Regione |
Regione |
| 1 |
Veneto |
| 2 |
Campania |
| 3 |
Abruzzo |
Province | ID |
ID_Regione |
Provincia |
| 1 |
1 |
Venezia |
| 2 |
1 |
Belluno |
| 3 |
2 |
Napoli |
| 4 |
2 |
Salerno |
| 5 |
3 |
Pescara |
Eseguendo questa query:
SELECT regione, provincia
FROM regioni INNER JOIN province ON
regioni.ID = province.ID_regione
Quello che si ottiene sarà un recordset con questo contenuto:
Recordset risultato della query | Regione |
Provincia |
| Veneto |
Venezia |
| Veneto |
Belluno |
| Campania |
Napoli |
| Campania |
Salerno |
| Abruzzo |
Pescara |
LEFT e RIGHT JOIN
In questo caso la corrispondenza tra regioni e province è perfetta, ma potrebbe non essere sempre così. Per esempio, usando INNER JOIN tra una tabella di persone e una di patenti, è possibile che ci siano persone che non hanno la patente.
Persone | ID |
Nome |
Cognome |
| 1 |
Guido |
Vespa |
| 2 |
Placido |
Mansueto |
Patenti | ID_persona |
Patente |
Rilasciata da |
| 1 |
VE1234567890 |
Pref. Venezia |
Facendo un INNER JOIN in questo caso si vedrebbero solo le persone che hanno la patente, ignorando quelle che non ce l'hanno, in quanto non hanno corrispondenze nell'altra tabella:
SELECT nome, cognome, patente
FROM persone INNER JOIN patenti ON
persone.ID = patenti.ID_persona
Recordset risultato della query | nome |
cognome |
patente |
| Guido |
Vespa |
VE1234567890 |
Come si vede, non c'è traccia di Placido Mansueto
Per ottenere comunque tutti gli elementi della tabella di persone occorre usare il
LEFT JOIN, che include tutti gli elementi della tabella di persone e le associa alle patenti che esistono; per gli altri, inserisce valori nulli:
SELECT nome, cognome, patente
FROM persone LEFT JOIN patenti ON
persone.ID = patenti.ID_persona
Recordset risultato della query | nome |
cognome |
patente |
| Guido |
Vespa |
VE1234567890 |
| Placido |
Mansueto |
|
In alternativa si sarebbe potuto costruire il join in maniera opposta, utilizzando il RIGHT JOIN:
SELECT nome, cognome, patente
FROM patenti RIGHT JOIN persone ON
patenti.ID_persona = persone.ID
La clausola RIGHT JOIN non è supportata da tutti i database.
FULL JOIN
Il join di tipo
FULL unisce tutte le righe di entrambe le tabelle, lasciando nulli i valori che non trovano una corrispondenza. Per esempio se ci sono degli invitati e dei tavoli, e si vogliono associare tra loro, si possono vedere tutti gli invitati e i tavoli, anche se ancora non sono associati tra loro:
| ID |
Nome |
| 1 |
Franca Polpetta |
| 2 |
Fausto Verdi |
| 3 |
Giulio Facchini |
| ID |
COD_tavolo |
ID_persona |
| 1 |
FIN1 |
1 |
| 2 |
FIN1 |
2 |
| 3 |
BAN1 |
|
| 4 |
BAN2 |
|
Eseguendo la query:
SELECT nome, COD_tavolo, Tavoli.ID
FROM persone FULL JOIN tavoli ON
persone.ID = tavoli.ID_persona
si ottiene questo recordset:
Recordset risultato della query | nome |
COD_tavolo |
Tavoli.ID |
| Franca Polpetta |
FIN1 |
1 |
| Fausto Verdi |
FIN1 |
2 |
| Giulio Facchini |
|
|
| |
BAN1 |
3 |
| |
BAN2 |
4 |
La clausola FULL JOIN non è supportata da tutti i database.
CROSS JOIN
Il
CROSS JOIN è il tipo di join più semplice, sia come sintassi sia per la tipologia di calcolo. Il principio è semplice: ad ogni elemento di una tabella si fa corrispondere ciascun elemento dell'altra tabella. In questo modo il numero di righe è dato dal prodotto delle due tabelle (cioè tutte le combinazioni possibili).
Per esempio, avendo una tabella di maschi e una di femmine
Tabella Maschi | Nome |
| Marco |
| Gino |
| Franco |
Tabella Femmine | Nome |
| Marta |
| Giulia |
| Francesca |
e volendo sapere tutte le coppie possibili, si possono unire con un CROSS JOIN:
SELECT maschi.nome, femmine.nome
FROM maschi, femmine
Recordset risultato della query | Maschi.Nome |
Femmine.Nome |
| Marco |
Marta |
| Gino |
Marta |
| Franco |
Marta |
| Marco |
Giulia |
| Gino |
Giulia |
| Franco |
Giulia |
| Marco |
Francesca |
| Gino |
Francesca |
| Franco |
Francesca |
INNER e OUTER
La differenza tra
INNER JOIN e
OUTER JOIN è che INNER mostra solo i record che hanno una corrispondenza in entrambe le tabelle, come già visto, mentre gli OUTER (a cui appartengono LEFT, RIGHT e FULL) accettano anche righe in cui non ci sia una corrispondenza perfetta tra le tabelle.
CROSS JOIN non è né INNER né OUTER, in quanto "forza" entrambe le tabelle ad avere sempre una corrispondenza perfetta
La clausola NATURAL
Nel caso in cui siano usati gli stessi nomi per campi che rappresentano lo stesso dato in tabelle diverse, per farne un join basta specificare la clausola NATURAL; in questo modo automaticamente i campi con lo stesso nome saranno legati tra loro. La clausola è utilizzabile sia con gli INNER sia con gli OUTER JOIN.
La clausola NATURAL JOIN non è supportata da tutti i database.
Categories
Database
Non ci sono commenti. [Aggiungere un commento]