La join
Forma generale
Negli esempi visti finora, abbiamo sempre considerato una sola relazione per il calcolo della query. In questa parte illustreremo come sia possibile includere nel calcolo più di una tabella. Questa operazione, chiamata anche join, si ottiene specificando di seguito alla parola chiave FROM il nome delle relazioni da considerare. In termini di algebra relazionale, questa operazione si definisce "prodotto" ed il suo risultato è identico a quello che in matematica viene detto "prodotto cartesiano".
Riportiamo la forma generale di una query che effettua una join:
SELECT . . . FROM nome_tab1, nome_tab2 [, . . .];
Allo scopo di facilitare la comprensione di questa operazione, consideriamo i dati di due nuove tabelle, una chiamata A, l'altra chiamata B.
| A | B |
|---|---|
|
|
|
gb |
|
i |
|
urss |
|
|
|
Il risultato della join
La tabella A si compone di due attributi animale e nome, mentre la tabella B si compone del solo attributo paese. Stando così le cose, non esiste alcun legame tra nome dell'animale e paese di appartenenza e, dal punto di vista pratico, il risultato che si ottiene, apparentemente, non ha molto significato.
Lo riportiamo insieme al testo della query con lo scopo di evidenziare come agisce, se usata da sola, l'operazione di join.
SELECT * FROM a, b; [19]
| ANIMALE | NOME | PAESE |
|---|---|---|
| gatto | tom | gb |
| topo | jerry | gb |
| cane | pluto | gb |
| papero | ciccio | gb |
| struzzo | bipbip | gb |
| gatto | tom | i |
| topo | jerry | i |
| cane | pluto | i |
| papero | ciccio | i |
| struzzo | bipbip | i |
| gatto | tom | urss |
| topo | jerry | urss |
| cane | pluto | urss |
| papero | ciccio | urss |
| struzzo | bipbip | urss |
Per chiarire sul risultato della query notiamo che fissata una tupla della relazione B, questa è stata associata a tutte le tuple della relazione A, e così via per tutte le tuple della relazione B. Le colonne invece sono banalmente la somma delle colonne di A con quelle di B. Questo risultato è detto "combinazione lineare".
In generale possiamo dire che l'operazione di join ottiene una relazione il cui grado è pari alla somma degli attributi di ogni tabella mentre la cardinalità è pari al prodotto delle cardinalità di ogni tabella.
È interessante notare, anche se dal punto di vista del risultato non cambia alcunché, cosa avviene se eseguiamo la query:
SELECT * FROM b, a; [19]
| PAESE | ANIMALE | NOME |
|---|---|---|
| gb | gatto | tom |
| i | gatto | tom |
| urss | gatto | tom |
| gb | topo | jerry |
| i | topo | jerry |
| urss | topo | jerry |
| gb | cane | pluto |
| i | cane | pluto |
| urss | cane | pluto |
| gb | papero | ciccio |
| i | papero | ciccio |
| urss | papero | ciccio |
| gb | struzzo | bipbip |
| i | struzzo | bipbip |
| urss | struzzo | bipbip |
Il risultato solo apparentemente è molto diverso; in realtà le d