SlideShare a Scribd company logo
1 of 29
Linguaggio SQL
Join tra tabelle
Interrogare un database
Schema del database
Riportiamo l’insieme delle tabelle del nostro database
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
Interrogare un database
Tabella CarteCredito
Il numero della carta e il relative saldo si
trovano nella tabella CarteCredito
Interrogare un database
Tabella Clienti
Il nome e il cognome dei clienti si trova nella
tabella Clienti.
Interrogare un database
Collegamento tra tabelle
Occorre dunque trovare un criterio per collegare
le due tabelle.
Interrogare un database
Criterio per collegare le tabelle
Ad esempio: quale riga della tabella Clienti
colleghiamo alla carta numero 1?
Interrogare un database
Criterio per collegare le tabelle
Risposta: la riga della tabella Clienti con lo
stesso CodiceFiscale
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
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
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;
Interrogare un database
Esempio su MySQL
Vediamo la query su MySQL
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;
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;
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;
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;
Interrogare un database
Esempio MySql
Risposta: in questi casi avremo dei null
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.
Interrogare un database
Tabella CarteCredito
Il numero del conto e il saldo si trovano nella
tabella ContoCorrente.
Interrogare un database
Tabella Clienti
Il codice fiscale e la residenza dei clienti si
trovano nella tabella Clienti.
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
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
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.
Interrogare un database
Join con relazioni molti a molti
Tra ClientiContiCorrenti e Clienti dobbiamo
considerare l’uguaglianza tra il codice fiscale.
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;
Interrogare un database
Query finale
Osserviamo attentamente l’output della query su
MySql
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.
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.
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.

More Related Content

What's hot

DSpace standard Data model and DSpace-CRIS
DSpace standard Data model and DSpace-CRISDSpace standard Data model and DSpace-CRIS
DSpace standard Data model and DSpace-CRISAndrea Bollini
 
OpenAIRE: Directrices 3.0, desarrollos y servicios para Gestores de Repositorios
OpenAIRE: Directrices 3.0, desarrollos y servicios para Gestores de RepositoriosOpenAIRE: Directrices 3.0, desarrollos y servicios para Gestores de Repositorios
OpenAIRE: Directrices 3.0, desarrollos y servicios para Gestores de RepositoriosOpenAIRE
 
[Data Lake + Arquitetura Lambda] na prática
 [Data Lake + Arquitetura Lambda] na prática [Data Lake + Arquitetura Lambda] na prática
[Data Lake + Arquitetura Lambda] na práticaFelipe Santos
 
Semantic Web for Cultural Heritage valorisation
Semantic Web for Cultural Heritage valorisationSemantic Web for Cultural Heritage valorisation
Semantic Web for Cultural Heritage valorisationValentina Carriero
 
Data Modeling for MongoDB
Data Modeling for MongoDBData Modeling for MongoDB
Data Modeling for MongoDBMongoDB
 
Catalogo integrador de recursos y servivios
Catalogo integrador de recursos y serviviosCatalogo integrador de recursos y servivios
Catalogo integrador de recursos y serviviosJuan Miguel Garrido
 
Cara membuat template opac slims dari html5
Cara membuat template opac slims dari html5Cara membuat template opac slims dari html5
Cara membuat template opac slims dari html5erwan setyo budi
 
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPTBài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPTMasterCode.vn
 
Yπολογιστικό νέφος
Yπολογιστικό νέφοςYπολογιστικό νέφος
Yπολογιστικό νέφος4o Lykeio Alex/polis
 

What's hot (10)

DSpace standard Data model and DSpace-CRIS
DSpace standard Data model and DSpace-CRISDSpace standard Data model and DSpace-CRIS
DSpace standard Data model and DSpace-CRIS
 
OpenAIRE: Directrices 3.0, desarrollos y servicios para Gestores de Repositorios
OpenAIRE: Directrices 3.0, desarrollos y servicios para Gestores de RepositoriosOpenAIRE: Directrices 3.0, desarrollos y servicios para Gestores de Repositorios
OpenAIRE: Directrices 3.0, desarrollos y servicios para Gestores de Repositorios
 
[Data Lake + Arquitetura Lambda] na prática
 [Data Lake + Arquitetura Lambda] na prática [Data Lake + Arquitetura Lambda] na prática
[Data Lake + Arquitetura Lambda] na prática
 
Usando dublin core
Usando dublin coreUsando dublin core
Usando dublin core
 
Semantic Web for Cultural Heritage valorisation
Semantic Web for Cultural Heritage valorisationSemantic Web for Cultural Heritage valorisation
Semantic Web for Cultural Heritage valorisation
 
Data Modeling for MongoDB
Data Modeling for MongoDBData Modeling for MongoDB
Data Modeling for MongoDB
 
Catalogo integrador de recursos y servivios
Catalogo integrador de recursos y serviviosCatalogo integrador de recursos y servivios
Catalogo integrador de recursos y servivios
 
Cara membuat template opac slims dari html5
Cara membuat template opac slims dari html5Cara membuat template opac slims dari html5
Cara membuat template opac slims dari html5
 
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPTBài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
 
Yπολογιστικό νέφος
Yπολογιστικό νέφοςYπολογιστικό νέφος
Yπολογιστικό νέφος
 

More from Nicola Iantomasi

Esercizi di Algebra lineare su autovalori e autovettori
Esercizi di Algebra lineare su autovalori e autovettoriEsercizi di Algebra lineare su autovalori e autovettori
Esercizi di Algebra lineare su autovalori e autovettoriNicola Iantomasi
 
Progettazione di un database relazionale
Progettazione di un database relazionaleProgettazione di un database relazionale
Progettazione di un database relazionaleNicola Iantomasi
 
Rango di una matrice e teorema di rouche capelli
Rango di una matrice e teorema di rouche capelliRango di una matrice e teorema di rouche capelli
Rango di una matrice e teorema di rouche capelliNicola Iantomasi
 
Linguaggio SQL: utilizzo di group by e having
Linguaggio SQL: utilizzo di group by e havingLinguaggio SQL: utilizzo di group by e having
Linguaggio SQL: utilizzo di group by e havingNicola Iantomasi
 
Creare tabelle sul database MySql
Creare tabelle sul database MySqlCreare tabelle sul database MySql
Creare tabelle sul database MySqlNicola Iantomasi
 
Fondamenti di algebra lineare, parte 2: sistemi lineari, autovalori e autovet...
Fondamenti di algebra lineare, parte 2: sistemi lineari, autovalori e autovet...Fondamenti di algebra lineare, parte 2: sistemi lineari, autovalori e autovet...
Fondamenti di algebra lineare, parte 2: sistemi lineari, autovalori e autovet...Nicola Iantomasi
 
Fondamenti di algebra lineare, parte 1: vettori e matrici
Fondamenti di algebra lineare, parte 1: vettori e matriciFondamenti di algebra lineare, parte 1: vettori e matrici
Fondamenti di algebra lineare, parte 1: vettori e matriciNicola Iantomasi
 
Tabelle pivot e import dati su Microsoft Excel
Tabelle pivot e import dati su Microsoft ExcelTabelle pivot e import dati su Microsoft Excel
Tabelle pivot e import dati su Microsoft ExcelNicola Iantomasi
 

More from Nicola Iantomasi (8)

Esercizi di Algebra lineare su autovalori e autovettori
Esercizi di Algebra lineare su autovalori e autovettoriEsercizi di Algebra lineare su autovalori e autovettori
Esercizi di Algebra lineare su autovalori e autovettori
 
Progettazione di un database relazionale
Progettazione di un database relazionaleProgettazione di un database relazionale
Progettazione di un database relazionale
 
Rango di una matrice e teorema di rouche capelli
Rango di una matrice e teorema di rouche capelliRango di una matrice e teorema di rouche capelli
Rango di una matrice e teorema di rouche capelli
 
Linguaggio SQL: utilizzo di group by e having
Linguaggio SQL: utilizzo di group by e havingLinguaggio SQL: utilizzo di group by e having
Linguaggio SQL: utilizzo di group by e having
 
Creare tabelle sul database MySql
Creare tabelle sul database MySqlCreare tabelle sul database MySql
Creare tabelle sul database MySql
 
Fondamenti di algebra lineare, parte 2: sistemi lineari, autovalori e autovet...
Fondamenti di algebra lineare, parte 2: sistemi lineari, autovalori e autovet...Fondamenti di algebra lineare, parte 2: sistemi lineari, autovalori e autovet...
Fondamenti di algebra lineare, parte 2: sistemi lineari, autovalori e autovet...
 
Fondamenti di algebra lineare, parte 1: vettori e matrici
Fondamenti di algebra lineare, parte 1: vettori e matriciFondamenti di algebra lineare, parte 1: vettori e matrici
Fondamenti di algebra lineare, parte 1: vettori e matrici
 
Tabelle pivot e import dati su Microsoft Excel
Tabelle pivot e import dati su Microsoft ExcelTabelle pivot e import dati su Microsoft Excel
Tabelle pivot e import dati su Microsoft Excel
 

Linguaggio SQL: join tra tabelle

  • 2. Interrogare un database Schema del database Riportiamo l’insieme delle tabelle del nostro database
  • 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
  • 4. Interrogare un database Tabella CarteCredito Il numero della carta e il relative saldo si trovano nella tabella CarteCredito
  • 5. Interrogare un database Tabella Clienti Il nome e il cognome dei clienti si trova nella tabella Clienti.
  • 6. Interrogare un database Collegamento tra tabelle Occorre dunque trovare un criterio per collegare le due tabelle.
  • 7. Interrogare un database Criterio per collegare le tabelle Ad esempio: quale riga della tabella Clienti colleghiamo alla carta numero 1?
  • 8. Interrogare un database Criterio per collegare le tabelle Risposta: la riga della tabella Clienti con lo stesso CodiceFiscale
  • 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;
  • 12. Interrogare un database Esempio su MySQL Vediamo la query su MySQL
  • 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;
  • 17. Interrogare un database Esempio MySql Risposta: in questi casi avremo dei null
  • 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.
  • 19. Interrogare un database Tabella CarteCredito Il numero del conto e il saldo si trovano nella tabella ContoCorrente.
  • 20. Interrogare un database Tabella Clienti Il codice fiscale e la residenza dei clienti si trovano nella tabella 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;
  • 26. Interrogare un database Query finale Osserviamo attentamente l’output della query su MySql
  • 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.