1. Corso di Basi di Dati e Laboratorio
Esercitazione di algebra
relazionale e SQL
Alfio Ferrara - Stefano Montanelli
A.A. 2005/2006 Basi di Dati e Laboratorio 1
Simbologia
SELEZIONE σ< condizione >(R)
PROIEZIONE Π< attributi >(R)
THETA JOIN R1 < condizione >R2
EQUIJOIN R1 < condizione ‘=‘ >R2
JOIN NATURALE R1 * R2
A.A. 2005/2006 Basi di Dati e Laboratorio 2
Simbologia
UNIONE R1 ∪ R2
INTERSEZIONE R1 ∩ R2
DIFFERENZA R1 – R2
PRODOTTO
R1 × R2
CARTESIANO
R1(Z) ÷ R2(Y)
DIVISIONE
con Z = X ∪ Y
A.A. 2005/2006 Basi di Dati e Laboratorio 3
1
2. 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 4
Schema relazionale
CENTRO NOMEC REGIONE AREA ABITANTI
Mantova Lombardia N 120.000
Torino Piemonte N 900.000
Napoli Campania S 1.000.000
Pavia Lombardia N 90.000
Pisa Toscana C 110.000
Firenze Toscana C 500.000
ATTRAVERSAMENTI FIUME
NOMEC FIUME NOMEF LUNGHEZZA
Torino Po Po 1.000.000
Mantova Po Ticino 100.000
Pavia Ticino Tevere 70.000
Pisa Arno Arno 55.000
Firenze Arno
A.A. 2005/2006 Basi di Dati e Laboratorio 5
Domanda 1
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)
– FIUME(NomeF, Lunghezza)
– ATTRAVERSAMENTI( NomeC, Fiume)
– Formulare in algebra relazionale ottimizzata
la seguente interrogazione:
– Trovare nome e lunghezza dei fiumi che
attraversano centri del nord con più di
100000 abitanti
A.A. 2005/2006 Basi di Dati e Laboratorio 6
2
3. Soluzione 1
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)
– FIUME(NomeF, Lunghezza)
– ATTRAVERSAMENTI( NomeC, Fiume)
Trovare nome e lunghezza dei fiumi che attraversano
centri del nord con più di 100000 abitanti
ΠNomeF,Lunghezza ((FIUME) NomeF=Fiume
(ΠFiume ((ATTRAVERSAMENTI) *
(ΠNomeC (σAbitanti>100000 (σArea=‘N’ (CENTRO)))))))
A.A. 2005/2006 Basi di Dati e Laboratorio 7
Soluzione 1
NOMEC REGIONE AREA ABITANTI
Mantova Lombardia N 90.000
Torino Piemonte N 900.000
Napoli Campania S 1.000.000
Pavia Lombardia N 110.000
Pisa Toscana C 110.000
Firenze Toscana C 500.000
NOMEC FIUME NOMEF LUNGHEZZA
Torino Po Po 1.000.000
Mantova Po Ticino 100.000
Pavia Ticino Tevere 70.000
Pisa Arno Arno 55.000
Firenze Arno
A.A. 2005/2006 Basi di Dati e Laboratorio 8
Domanda 2
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)
– FIUME(NomeF, Lunghezza)
– ATTRAVERSAMENTI( NomeC, Fiume)
– Formulare in algebra relazionale ottimizzata
la seguente interrogazione:
– Trovare nome e lunghezza dei fiumi che
attraversano sia centri del Piemonte che
della Lombardia
A.A. 2005/2006 Basi di Dati e Laboratorio 9
3
4. Soluzione 2
Trovare nome e lunghezza dei fiumi che attraversano sia
centri del Piemonte che della Lombardia
ΠNomeF,Lunghezza ((FIUME) NomeF=Fiume
((ΠFiume ((ATTRAVERSAMENTI) *
(ΠNomeC (σRegione=‘Piemonte’ (CENTRO)))))
∩
(ΠFiume ((ATTRAVERSAMENTI) *
(ΠNomeC (σRegione=‘Lombardia’ (CENTRO)))))))
A.A. 2005/2006 Basi di Dati e Laboratorio 10
Soluzione 2
NOMEC REGIONE AREA ABITANTI
Mantova Lombardia N 120.000
Torino Piemonte N 900.000
Napoli Campania S 1.000.000
Pavia Lombardia N 90.000
Pisa Toscana C 110.000
Firenze Toscana C 500.000
NOMEC FIUME NOMEF LUNGHEZZA
Torino Po Po 1.000.000
Mantova Po Ticino 100.000
Pavia Ticino Tevere 70.000
Pisa Arno Arno 55.000
Firenze Arno
A.A. 2005/2006 Basi di Dati e Laboratorio 11
Domanda 3
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)
– FIUME(NomeF, Lunghezza)
– ATTRAVERSAMENTI( NomeC, Fiume)
– Formulare in algebra relazionale ottimizzata
la seguente interrogazione:
– Trovare il nome dei fiumi che non
attraversano centri del sud
A.A. 2005/2006 Basi di Dati e Laboratorio 12
4
5. Soluzione 3
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)
– FIUME(NomeF, Lunghezza)
– ATTRAVERSAMENTI( NomeC, Fiume)
Trovare il nome fiumi che non attraversano centri del
sud
((ΠNomeF (FIUME))
-
(ΠFiume((ΠNomeC(σArea=‘S’ (CENTRO))) *
(ATTRAVERSAMENTI))))
A.A. 2005/2006 Basi di Dati e Laboratorio 13
Soluzione 3
NOMEC REGIONE AREA ABITANTI
Mantova Lombardia N 120.000
Torino Piemonte N 900.000
Napoli Campania S 1.000.000
Pavia Lombardia N 90.000
Pisa Toscana C 110.000
Firenze Toscana C 500.000
NOMEC FIUME NOMEF LUNGHEZZA
Torino Po Po 1.000.000
Mantova Po Ticino 100.000
Pavia Ticino Tevere 70.000
Pisa Arno Arno 55.000
Firenze Arno
A.A. 2005/2006 Basi di Dati e Laboratorio 14
Domanda 4
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)
– FIUME(NomeF, Lunghezza)
– ATTRAVERSAMENTI( NomeC, Fiume)
– Formulare in algebra relazionale ottimizzata
la seguente interrogazione:
– Trovare il nome dei fiumi che attraversano
tutte le città del centro
A.A. 2005/2006 Basi di Dati e Laboratorio 15
5
6. Soluzione 4
– CENTRO(NomeC, Regione, Area(N/C/S), Abitanti)
– FIUME(NomeF, Lunghezza)
– ATTRAVERSAMENTI( NomeC, Fiume)
Trovare il nome dei fiumi che attraversano tutte le città
del centro
(ATTRAVERSAMENTI) ÷
(ΠNomeC(σArea=‘C’ (CENTRO)))
A.A. 2005/2006 Basi di Dati e Laboratorio 16
Soluzione 4
NOMEC REGIONE AREA ABITANTI
Mantova Lombardia N 120.000
Torino Piemonte N 900.000
Napoli Campania S 1.000.000
Pavia Lombardia N 90.000
Pisa Toscana C 110.000
Firenze Toscana C 500.000
NOMEC FIUME NOMEF LUNGHEZZA
Torino Po Po 1.000.000
Mantova Po Ticino 100.000
Pavia Ticino Tevere 70.000
Pisa Arno Arno 55.000
Firenze Arno
A.A. 2005/2006 Basi di Dati e Laboratorio 17
Schema Relazionale
– 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 18
6
7. Query 1
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Formulare in SQL la seguente interrogazione:
Determinare nome, cognome delle persone
che appartengono solo al gruppo “laboratorio”
oppure solo al gruppo “progetto H”
A.A. 2005/2006 Basi di Dati e Laboratorio 19
Soluzione query 1
Estrazione delle persone appartenenti solo al
gruppo laboratorio (preparatoria alla query):
SELECT persona.id, persona.nome, persona.cognome,
gruppo.nome AS gruppo
FROM persona, appartenenza, gruppo
WHERE ((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))))
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, gruppo
WHERE ((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))))
UNION
SELECT persona.id, persona.nome, persona.cognome,
gruppo.nome AS gruppo
FROM persona, appartenenza, gruppo
WHERE ((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))))
A.A. 2005/2006 Basi di Dati e Laboratorio 21
7
8. Query 2
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Formulare in SQL la seguente interrogazione:
Determinare ordinandoli alfabeticamente
identificatore, nome, cognome delle persone
che appartengono ad almeno due gruppi
A.A. 2005/2006 Basi di Dati e Laboratorio 22
Soluzione query 2
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Determinare, ordinandoli alfabeticamente, identificatore,
nome, cognome delle persone che appartengono ad almeno
due gruppi
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
A.A. 2005/2006 Basi di Dati e Laboratorio 23
Query 3
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Formulare in SQL la seguente interrogazione:
Determinare identificatore, nome, cognome
della persona che appartiene al maggior
numero di gruppi
A.A. 2005/2006 Basi di Dati e Laboratorio 24
8
9. Soluzione query 3
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Determinare identificatore, nome, cognome della persona
che appartiene al maggior numero di gruppi
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))
A.A. 2005/2006 Basi di Dati e Laboratorio 25
9