A volte dobbiamo selezionare dati da due o più tabelle per avere dei risultati completi. In questi casi occorre effettuare dei Join tra le tabelle.
Vediamo come.
Joins e chiavi
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.
Nella tabella in basso denominata "Impiegati" il campo "ID_Impiegato" è la chiave primaria, questo significa che non possono esistere due righe con lo stesso identificatore. ID_Impiegato distingue due persone, anche se queste hanno lo stesso nome.
Se guardiamo l’esempio, notiamo che:
La colonna "ID_Impiegato" è la chiave primaria della tabella "Impiegati"
"ID_Prodotto" è la chiave primaria per la tabella "Ordini"
La colonna "ID_Impiegato" nalla tabella "Ordini" è usata per fare riferimento alla persona nella tabella "Impiegati" senza dover usare il nome
Tabella Impiegati
ID_Impiegato | Nome |
01 | Paolino Paperino |
02 | Paperon De Paperoni |
03 | Aldo Baglio |
04 | Aldo Bisio |
Ordini:
ID_Prodotto | Prodotto | ID_Imoiegato |
234 | Stampante | 01 |
657 | Tavolo | 03 |
865 | Sedia | 03 |
Fare riferimento a due tabelle
Possiamo seezionare dei dati da due tabelle facendo riferimento alle due tabelle in questo modo:
Esempio
Chi ha ordinato un prodotto, e quali prodotti sono stati ordinati?
SELECT Impiegati.Nome, Ordini.ProdottoRisultato
FROM Impiegati, Ordini
WHERE Impiegati.ID_Impiegato=Ordini.ID_Impiegato
Nome | Prodotto |
Paolino Paperino | Stampante |
Aldo Baglio | Tavolo |
Aldo Baglio | Sedia |
Esempio
Chi ha ordinato una stampante?
SELECT Impiegati.NomeRisultato
FROM Impiegati, Ordini
WHERE Impiegati.ID_Impiegato=Ordini.ID_Impiegato
AND Ordini.Prodotto='Stampante'
Nome
Paolino Paperino
Utilizzare i Join
Possiamo anche selezionare dei dati da due tabelle utilizzando la parola chiave JOIN, come negli esempi seguenti:
Abbiamo tre tipi di Join:
INNER JOIN
LEFT JOIN
RIGTH JOIN
Con significati leggermente diversi
INNER JOIN
L'INNER JOIN restituisce le righe delle tabelle se c'è un legame, altrimenti non le mostra.
Sintassi
SELECT campo1, campo2, campo3Esempio
FROM prima_tabella
INNER JOIN seconda_tabella
ON prima_tabella.chiave_primaria = seconda_tabella.chiave_esterna
Chi ha ordinato un prodotto, e quali prodotti sono stati ordinati?
SELECT Impiegati.Nome, Ordini.ProdottoRisultato
FROM Impiegati
INNER JOIN Ordini
ON Impiegati.ID_Impiegato=Ordini.ID_Impiegato
Nome | Prodotto |
Paolino Paperino | Stampante |
Aldo Baglio | Tavolo |
Aldo Baglio | Sedia |
Esempio
Chi ha ordinato una stampante?
SELECT Impiegati.NomeRisultato
FROM Impiegati
INNER JOIN Ordini
ON Impiegati.ID_Impiegato=Ordini.ID_Impiegato
WHERE Ordini.Prodotto='Stampante'
Nome
Nome |
Paolino Paperino |
LEFT JOIN
Il LEFT JOIN restituisce tutte le righe della prima tabella (nell’esempio Impiegati), anche se non ci sono
corrispondenze nella seconda tabella (nell’esempio Ordini).
Sintassi
SELECT campo1, campo2, campo3Esempio
FROM prima_tabella
LEFT JOIN seconda_tabella
ON prima_tabella.chiave_primaria = seconda_tabella.chiave_esterna
Visualizzare tutti gli impiegati, ed i loro ordini (se ne hanno)
SELECT Impiegati.Nome, Ordini.ProdottoRisultato
FROM Impiegati
LEFT JOIN Ordini
ON Impiegati.ID_Impiegato=Ordini.ID_Impiegato
Nome | Prodotto |
Paolino Paperino | Stampante |
Paperon De Paperoni | Tavolo |
Aldo Baglio | Tavolo |
Aldo Baglio | Sedia |
Aldo Bisio | |
RIGHT JOIN
Un RIGHT JOIN restituisce tutte le righe della seconda tabella, anche se non ci sono legami con la prima
Sintassi
SELECT campo1, campo2, campo3Esempio
FROM prima_tabella
RIGHT JOIN seconda_tabella
ON prima_tabella.chiave_primaria = seconda_tabella.chiave_esterna
Mostrare tutti gli ordini, a chi appartengono (se appartengono a qualcuno)
SELECT Impiegati.Nome, Ordini.ProdottoRisultato
FROM Impiegati
RIGHT JOIN Ordini
ON Impiegati.ID_Impiegato=Ordini.ID_Impiegato
Nome | Prodotto |
Paolino Paperino | Stampante |
Aldo Baglio | Tavolo |
Aldo Baglio | Sedia |