3. Interrogare un database
Nuova tipologia di domande
Nelle domande poste finora, tutti i dati e i filtri richiesti facevano
riferimento ad un’unica tabella alla volta.
Come rispondiamo invece a domande di questo genere?
- Riportare per ogni carta di credito il suo numero, il saldo, il
nome e il cognome del relativo cliente
9. Interrogare un database
INNER JOIN e ON
Per collegare le due tabelle secondo il criterio
del codice fiscale occorre usare una nuova
sintassi nella clausula FROM: i costrutti INNER
JOIN e ON:
FROM CarteCredito
INNER JOIN Clienti
ON CarteCredito.CodiceFiscale =
Clienti.CodiceFiscale
10. Interrogare un database
Rinomina tabelle
Per “alleggerire” questa sintassi possiamo
rinominare le tabelle nella query tramite la
parola AS
FROM CarteCredito AS Cc
INNER JOIN Clienti as Cl
ON Cc.CodiceFiscale =
Cl.CodiceFiscale
11. Interrogare un database
Query finale
Possiamo ora rispondere alla domanda di partenza:
Riportare per ogni carta di credito il suo numero, il saldo, il
nome e il cognome del relativo cliente
SELECT Cc.Carta, Cc.Saldo, Cl.nome, Cl.cognome
FROM CarteCredito AS Cc
INNER JOIN Clienti as Cl
ON Cc.CodiceFiscale =
Cl.CodiceFiscale;
13. Interrogare un database
Tipologie di JOIN
Domanda: cosa succede se il codice fiscale associato alla
carta di credito non ha nessun record corrispondente nella
tabella dei clienti?
La query precedente non mostrerà queste carte di credito
FROM CarteCredito AS Cc
INNER JOIN Clienti as Cl
ON Cc.CodiceFiscale =
Cl.CodiceFiscale;
14. Interrogare un database
LEFT JOIN
In alcune, circostanze ci potrebbe essere chiesto di
visualizzare comunque queste carte di credito.
A tal fine basta modificare la tipologia di Join della query
precedente, passando da INNER JOIN a LEFT JOIN
FROM CarteCredito AS Cc
LEFT JOIN Clienti as Cl
ON Cc.CodiceFiscale =
Cl.CodiceFiscale;
15. Interrogare un database
RIGHT JOIN
Analogamente, se volessimo vedere anche i Clienti che non
hanno carte di credito associate, basterà modificare la
tipologia di Join passando da INNER JOIN a RIGHT JOIN
FROM CarteCredito AS Cc
RIGHT JOIN Clienti as Cl
ON Cc.CodiceFiscale =
Cl.CodiceFiscale;
16. Interrogare un database
Righe senza corrispondenze
Domanda: cosa succede quando visualizziamo colonne della
tabella CarteCredito per Clienti che non ne hanno nessuna?
SELECT Cc.Carta, Cc.Saldo, Cl.nome, Cl.cognome
FROM CarteCredito AS Cc
RIGHT JOIN Clienti as Cl
ON Cc.CodiceFiscale =
Cl.CodiceFiscale;
18. Interrogare un database
Nuova tipologia di domande
Proviamo a rispondere ad un’altra domanda:
- riportare per ogni conto corrente il suo numero, il saldo, il
codice fiscale e il numero dei clienti.
21. Interrogare un database
Join con relazioni molti a molti
La relazione ContiCorrenti-Clienti è molti a molti,
di conseguenza è presente una tabella di
associazione di nome ClientiContiCorrenti
22. Interrogare un database
Join con relazioni molti a molti
Di conseguenza, per collegare le tabelle
ContoCorrente e Cliente abbiamo bisogno di due
JOIN:
- una tra la tabella ContoCorrente e la tabella
ClientiContiCorrenti
- una tra la tabella ClientiContiCorrenti e la
tabella Clienti
23. Interrogare un database
Join con relazioni molti a molti
Occorre stabilire i criteri di JOIN. Si tratta di
scelte “naturali”.
Tra ContoCorrente e ClientiContiCorrenti dobbiamo
considerare l’uguaglianza tra il numero dei conti.
24. Interrogare un database
Join con relazioni molti a molti
Tra ClientiContiCorrenti e Clienti dobbiamo
considerare l’uguaglianza tra il codice fiscale.
25. Interrogare un database
Query finale
In definitiva, al netto di riconsiderare la
tipologia di Join in base al comportamento
desiderato, abbiamo la query
SELECT Cc.Conto, Cc.Saldo,
Cl.CodiceFiscale, Cl.Residenza
FROM ContoCorrente AS Cc
INNER JOIN ClientiContiCorrente As Associazione
ON Cc.Conto = Associazione.Conto
INNER JOIN Clienti As Cl
ON Associazione.CodiceFiscale = Cl.CodiceFiscale;
27. Interrogare un database
Analisi risultati join
Notiamo che i conti numero 1 e 12 sono ripetuti in
due righe ciascuno.
Ciò può essere considerato corretto perché per
ognuno di questi conti sono associati due differenti
clienti con codici fiscali distinti.
28. Interrogare un database
Analisi risultati join
Osserviamo però che anche la colonna dei saldi è
ripetuta.
Di conseguenza, otteniamo un risultato errato se
calcoliamo la somma dei valori di questa colonna
dopo la Join.
Infatti calcoleremmo due volte (una per ogni
cliente) ciascuno dei due saldi condivisi dei conti
1 e 12.
29. Interrogare un database
Esercizi
1) Per ogni servizio, riportare il numero del
servizio, il numero del conto, la data di
apertura del conto e la data di apertura del
servizio
2) Riportare per ogni carta di credito, il numero
della carta, la tipologia, il circuito, il numero
del cliente associato e il suo impiego. Se un
cliente non ha carte associate, riportare
comunque i suoi dati.