Esercitazioni 03 Algebra + S Q L
-
Upload
guestbe916c -
Category
Business
-
view
568 -
download
0
Transcript of Esercitazioni 03 Algebra + S Q L
1
A.A. 2005/2006 Basi di Dati e Laboratorio 1
Corso di Basi di Dati e Laboratorio
Esercitazione di algebra relazionale e SQLAlfio Ferrara - Stefano Montanelli
A.A. 2005/2006 Basi di Dati e Laboratorio 2
Simbologia
R1 * R2JOIN NATURALE
R1 < condizione ‘=‘ >R2EQUIJOIN
R1 < condizione >R2THETA JOIN
Π< attributi >(R)PROIEZIONE
σ< condizione >(R)SELEZIONE
A.A. 2005/2006 Basi di Dati e Laboratorio 3
Simbologia
R1(Z) ÷ R2(Y)con Z = X ∪ Y
DIVISIONE
R1 × R2PRODOTTOCARTESIANO
R1 – R2DIFFERENZA
R1 ∩ R2INTERSEZIONE
R1 ∪ R2UNIONE
2
A.A. 2005/2006 Basi di Dati e Laboratorio 4
Schema relazionale
• Schema relazionale
– CENTRO(NomeC, Regione, Area(N/C/S),Abitanti)
– FIUME(NomeF, Lunghezza)– ATTRAVERSAMENTI(NomeC, Fiume)
A.A. 2005/2006 Basi di Dati e Laboratorio 5
ATTRAVERSAMENTI
55.000Arno70.000Tevere100.000Ticino
1.000.000PoLUNGHEZZANOMEF
Schema relazionaleCENTRO
FIUME
500.000CToscanaFirenze110.000CToscanaPisa
1.000.000SCampaniaNapoli90.000NLombardiaPavia
900.000NPiemonteTorino120.000NLombardiaMantova
ABITANTIAREAREGIONENOMEC
ArnoFirenzeArnoPisaTicinoPavia
PoMantovaPoTorino
FIUMENOMEC
A.A. 2005/2006 Basi di Dati e Laboratorio 6
Domanda 1
– Formulare in algebra relazionale ottimizzatala seguente interrogazione:
– Trovare nome e lunghezza dei fiumi che attraversano centri del nord con più di 100000 abitanti
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)– FIUME(NomeF, Lunghezza)– ATTRAVERSAMENTI( NomeC, Fiume)
3
A.A. 2005/2006 Basi di Dati e Laboratorio 7
Soluzione 1
Trovare nome e lunghezza dei fiumi che attraversano centri del nord con più di 100000 abitanti
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)– FIUME(NomeF, Lunghezza)– ATTRAVERSAMENTI( NomeC, Fiume)
ΠNomeF,Lunghezza ((FIUME) NomeF=Fiume
(ΠFiume ((ATTRAVERSAMENTI) *
(ΠNomeC (σAbitanti>100000 (σArea=‘N’ (CENTRO)))))))
A.A. 2005/2006 Basi di Dati e Laboratorio 8
55.000Arno70.000Tevere100.000Ticino
1.000.000PoLUNGHEZZANOMEF
Soluzione 1
500.000CToscanaFirenze110.000CToscanaPisa
1.000.000SCampaniaNapoli110.000NLombardiaPavia
900.000NPiemonteTorino90.000NLombardiaMantova
ABITANTIAREAREGIONENOMEC
ArnoFirenzeArnoPisaTicinoPavia
PoMantovaPoTorino
FIUMENOMEC
A.A. 2005/2006 Basi di Dati e Laboratorio 9
Domanda 2
– Formulare in algebra relazionale ottimizzatala seguente interrogazione:
– Trovare nome e lunghezza dei fiumi che attraversano sia centri del Piemonte che della Lombardia
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)– FIUME(NomeF, Lunghezza)– ATTRAVERSAMENTI( NomeC, Fiume)
4
A.A. 2005/2006 Basi di Dati e Laboratorio 10
ΠNomeF,Lunghezza ((FIUME) NomeF=Fiume
((ΠFiume ((ATTRAVERSAMENTI) *
(ΠNomeC (σRegione=‘Piemonte’ (CENTRO)))))
∩
(ΠFiume ((ATTRAVERSAMENTI) *
(ΠNomeC (σRegione=‘Lombardia’ (CENTRO)))))))
Soluzione 2
Trovare nome e lunghezza dei fiumi che attraversano sia centri del Piemonte che della Lombardia
A.A. 2005/2006 Basi di Dati e Laboratorio 11
ArnoFirenzeArnoPisaTicinoPavia
PoMantovaPoTorino
FIUMENOMEC
Soluzione 2
55.000Arno70.000Tevere100.000Ticino
1.000.000PoLUNGHEZZANOMEF
500.000CToscanaFirenze110.000CToscanaPisa
1.000.000SCampaniaNapoli90.000NLombardiaPavia
900.000NPiemonteTorino120.000NLombardiaMantova
ABITANTIAREAREGIONENOMEC
A.A. 2005/2006 Basi di Dati e Laboratorio 12
Domanda 3
– Formulare in algebra relazionale ottimizzatala seguente interrogazione:
– Trovare il nome dei fiumi che non attraversano centri del sud
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)– FIUME(NomeF, Lunghezza)– ATTRAVERSAMENTI( NomeC, Fiume)
5
A.A. 2005/2006 Basi di Dati e Laboratorio 13
Soluzione 3
Trovare il nome fiumi che non attraversano centri del sud
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)– FIUME(NomeF, Lunghezza)– ATTRAVERSAMENTI( NomeC, Fiume)
((ΠNomeF (FIUME))
-
(ΠFiume((ΠNomeC(σArea=‘S’ (CENTRO))) *
(ATTRAVERSAMENTI))))
A.A. 2005/2006 Basi di Dati e Laboratorio 14
55.000Arno
70.000Tevere100.000Ticino
1.000.000PoLUNGHEZZANOMEF
ArnoFirenzeArnoPisaTicinoPavia
PoMantovaPoTorino
FIUMENOMEC
Soluzione 3
500.000CToscanaFirenze110.000CToscanaPisa
1.000.000SCampaniaNapoli90.000NLombardiaPavia
900.000NPiemonteTorino120.000NLombardiaMantova
ABITANTIAREAREGIONENOMEC
A.A. 2005/2006 Basi di Dati e Laboratorio 15
Domanda 4
– Formulare in algebra relazionale ottimizzatala seguente interrogazione:
– Trovare il nome dei fiumi che attraversano tutte le città del centro
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)– FIUME(NomeF, Lunghezza)– ATTRAVERSAMENTI( NomeC, Fiume)
6
A.A. 2005/2006 Basi di Dati e Laboratorio 16
Soluzione 4
Trovare il nome dei fiumi che attraversano tutte le cittàdel centro
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)– FIUME(NomeF, Lunghezza)– ATTRAVERSAMENTI( NomeC, Fiume)
(ATTRAVERSAMENTI) ÷
(ΠNomeC(σArea=‘C’ (CENTRO)))
A.A. 2005/2006 Basi di Dati e Laboratorio 17
Soluzione 4
55.000Arno70.000Tevere100.000Ticino
1.000.000PoLUNGHEZZANOMEF
500.000CToscanaFirenze110.000CToscanaPisa
1.000.000SCampaniaNapoli90.000NLombardiaPavia
900.000NPiemonteTorino120.000NLombardiaMantova
ABITANTIAREAREGIONENOMEC
ArnoFirenzeArnoPisaTicinoPavia
PoMantovaPoTorino
FIUMENOMEC
A.A. 2005/2006 Basi di Dati e Laboratorio 18
Schema Relazionale
– RUOLO(id, nome, descrizione)– GRUPPO(id, nome, finanziamento)– PERSONA(id, nome, cognome, ruolo)– APPARTENENZA(id_persona, id_gruppo)
7
A.A. 2005/2006 Basi di Dati e Laboratorio 19
Query 1
Formulare in SQL la seguente interrogazione:
Determinare nome, cognome delle persone che appartengono solo al gruppo “laboratorio”oppure solo al gruppo “progetto H”
– RUOLO(id, nome, descrizione)– GRUPPO(id, nome, finanziamento)– PERSONA(id, nome, cognome, ruolo)– APPARTENENZA(id_persona, id_gruppo)
A.A. 2005/2006 Basi di Dati e Laboratorio 20
Soluzione query 1
SELECT persona.id, persona.nome, persona.cognome, gruppo.nome AS gruppo
FROM persona, appartenenza, gruppoWHERE ((persona.id=appartenenza.id_persona) AND
(appartenenza.id_gruppo=gruppo.id) AND(gruppo.nome='laboratorio') AND NOT EXISTS(SELECT * FROM persona alias, appartenenza, gruppoWHERE ((persona.id=appartenenza.id_persona) AND
(appartenenza.id_gruppo=gruppo.id) AND (gruppo.nome<>'laboratorio') AND (persona.id=alias.id))))
Estrazione delle persone appartenenti solo al gruppo laboratorio (preparatoria alla query):
A.A. 2005/2006 Basi di Dati e Laboratorio 21
Soluzione query 1SELECT persona.id, persona.nome, persona.cognome,
gruppo.nome AS gruppoFROM persona, appartenenza, gruppoWHERE ((persona.id=appartenenza.id_persona) AND(appartenenza.id_gruppo=gruppo.id) AND (gruppo.nome='laboratorio') AND NOT EXISTS (SELECT * FROM persona alias, appartenenza, gruppo
WHERE ((persona.id=appartenenza.id_persona) AND (appartenenza.id_gruppo=gruppo.id) AND (gruppo.nome<>'laboratorio') AND (persona.id=alias.id))))
UNIONSELECT persona.id, persona.nome, persona.cognome,
gruppo.nome AS gruppoFROM persona, appartenenza, gruppoWHERE ((persona.id=appartenenza.id_persona) AND(appartenenza.id_gruppo=gruppo.id) AND (gruppo.nome=‘progetto H') AND NOT EXISTS (SELECT * FROM persona alias, appartenenza, gruppo
WHERE ((persona.id=appartenenza.id_persona) AND (appartenenza.id_gruppo=gruppo.id) AND (gruppo.nome<>' progetto H') AND (persona.id=alias.id))))
8
A.A. 2005/2006 Basi di Dati e Laboratorio 22
Query 2
Formulare in SQL la seguente interrogazione:
Determinare ordinandoli alfabeticamente identificatore, nome, cognome delle persone che appartengono ad almeno due gruppi
– RUOLO(id, nome, descrizione)– GRUPPO(id, nome, finanziamento)– PERSONA(id, nome, cognome, ruolo)– APPARTENENZA(id_persona, id_gruppo)
A.A. 2005/2006 Basi di Dati e Laboratorio 23
Soluzione query 2
SELECT persona.id, persona.nome, persona.cognome, COUNT(*) AS Numerogruppi
FROM persona, appartenenza WHERE persona.id = appartenenza.id_persona GROUP BY persona.id, persona.nome, persona.cognome HAVING COUNT(*) > 1 ORDER BY persona.cognome, persona.nome
Determinare, ordinandoli alfabeticamente, identificatore, nome, cognome delle persone che appartengono ad almeno due gruppi
– RUOLO(id, nome, descrizione)– GRUPPO(id, nome, finanziamento)– PERSONA(id, nome, cognome, ruolo)– APPARTENENZA(id_persona, id_gruppo)
A.A. 2005/2006 Basi di Dati e Laboratorio 24
Query 3
Formulare in SQL la seguente interrogazione:
Determinare identificatore, nome, cognome della persona che appartiene al maggior numero di gruppi
– RUOLO(id, nome, descrizione)– GRUPPO(id, nome, finanziamento)– PERSONA(id, nome, cognome, ruolo)– APPARTENENZA(id_persona, id_gruppo)
9
A.A. 2005/2006 Basi di Dati e Laboratorio 25
Soluzione query 3
SELECT DISTINCT persona.id, persona.nome, persona.cognome, COUNT(*) AS Numerogruppi
FROM persona, appartenenza WHERE persona.id = appartenenza.id_persona GROUP BY persona.id, persona.nome, persona.cognome HAVING (COUNT(*) >= ALL (SELECT COUNT(*)
FROM persona, appartenenza WHERE persona.id = appartenenza.id_persona GROUP BY persona.id))
Determinare identificatore, nome, cognome della persona che appartiene al maggior numero di gruppi
– RUOLO(id, nome, descrizione)– GRUPPO(id, nome, finanziamento)– PERSONA(id, nome, cognome, ruolo)– APPARTENENZA(id_persona, id_gruppo)