A volte dobbiamo selezionare dati da due o più tabelle per avere dei risultati complete. In questi casi occorre effettuare dei Join.
Le tabelle in un database possono essere messe in relazione l’una con l’altra tramite delle chiavi.
Una chiave si dice primaria quando ha un valore unico per le righe. Lo scopo è quello di legare i dati tra le tabelle senza dover ripetere i dati in tutte le tabelle.
Una chiave si dice esterna se è il riferimento alla chiave primaria di un'altra tabella.
Abbiamo cinque tipi principali di Join:
La differenza sta nella modalità con cui vengono unite le tabelle.
Prediamo in esame due tabelle che utilizzeremo per gli esempi:
Tabella Società
Societa | Codice |
---|---|
Microsoft | 1 |
Oracle | 2 |
Sun | 3 |
HP | 4 |
MorpheusWeb | 5 |
Tabella Ordini
NumeroOrdine | Importo | CodiceSocieta |
---|---|---|
1001 | 100 | 1 |
1002 | 200 | 2 |
1003 | 50 | 3 |
1004 | 300 | 4 |
1005 | 80 | 1 |
1006 | 120 | 2 |
L'INNER JOIN restituisce le righe delle tabelle se c'è un legame, altrimenti non le mostra.
SELECT
Campi
FROM Prima_tabella
INNER JOIN Seconda_tabella
ON prima_tabella.chiave_primaria = seconda_tabella.chiave_esterna
SELECT
Societa, NumeroOrdine
FROM Societa
INNER JOIN Ordini
ON Societa.Codice = Ordini.CodiceSocieta
Otteniamo:
Societa | NumeroOrdine |
---|---|
Microsoft | 1001 |
Oracle | 1002 |
Sun | 1003 |
HP | 1004 |
Microsoft | 1005 |
Oracle | 1006 |
Il LEFT OUTER JOIN restituisce tutte le righe della prima tabella (nell’esempio Impiegati), anche se non ci sono corrispondenze nella seconda tabella (nell’esempio Ordini).
SELECT
Campi
FROM Prima_tabella
LEFT OUTER JOIN Seconda_tabella
ON prima_tabella.chiave_primaria = seconda_tabella.chiave_esterna
SELECT
Societa, NumeroOrdine
FROM Societa
LEFT OUTER JOIN Ordini
ON Societa.Codice = Ordini.CodiceSocieta
Otteniamo:
Societa | NumeroOrdine |
---|---|
Microsoft | 1001 |
Oracle | 1002 |
Sun | 1003 |
HP | 1004 |
Microsoft | 1005 |
Oracle | 1006 |
MorpheusWeb | NULL |
Un RIGTH OUTER JOIN restituisce tutte le righe della seconda tabella, anche se non ci sono legami con la prima
SELECT
Campi
FROM Prima_tabella
RIGTH OUTER JOIN Seconda_tabella
ON prima_tabella.chiave_primaria = seconda_tabella.chiave_esterna
SELECT
Societa, NumeroOrdine
FROM Ordini
LEFT OUTER JOIN Societa
ON Societa.Codice = Ordini.CodiceSocieta
Otteniamo:
Societa | NumeroOrdine |
---|---|
Microsoft | 1001 |
Oracle | 1002 |
Sun | 1003 |
HP | 1004 |
Microsoft | 1005 |
Oracle | 1006 |
MorpheusWeb | NULL |
Il full outer join restituisce tutte le righe delle due tabelle messe in join, è in pratica la combnazione tra una left join ed una right join
SELECT
Campi
FROM Prima_tabella
FULL JOIN Seconda_tabella
ON prima_tabella.chiave_primaria = seconda_tabella.chiave_esterna
SELECT
Societa, NumeroOrdine
FROM Societa
FULL JOIN Ordini
ON Societa.Codice = Ordini.CodiceSocieta
Otteniamo:
Societa | NumeroOrdine |
---|---|
Microsoft | 1001 |
Oracle | 1002 |
Sun | 1003 |
HP | 1004 |
Microsoft | 1005 |
Oracle | 1006 |
MorpheusWeb | NULL |
La cross Join restituisce il prodotto cartesiano tra due tabelle, ovvero tutte le combinazioni dei record.
SELECT
Campi
FROM Prima_tabella
CROSS JOIN Seconda_tabella
SELECT
Societa, NumeroOrdine
FROM Societa
CROSS JOIN Ordini
Otteniamo:
Societa | NumeroOrdine |
---|---|
Microsoft | 1001 |
Oracle | 1001 |
Sun | 1001 |
HP | 1001 |
MorpheusWeb | 1001 |
Microsoft | 1002 |
Oracle | 1002 |
Sun | 1002 |
HP | 1002 |
MorpheusWeb | 1002 |
Microsoft | 1003 |
Oracle | 1003 |
Sun | 1003 |
HP | 1003 |
MorpheusWeb | 1003 |
Microsoft | 1004 |
Oracle | 1004 |
Sun | 1004 |
HP | 1004 |
MorpheusWeb | 1004 |
Microsoft | 1005 |
Oracle | 1005 |
Sun | 1005 |
HP | 1005 |
MorpheusWeb | 1005 |
Microsoft | 1006 |
Oracle | 1006 |
Sun | 1006 |
HP | 1006 |
MorpheusWeb | 1006 |