Esercitazioni 03 Algebra + S Q L

670 views
623 views

Published on

Published in: Business, Travel
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
670
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
16
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Esercitazioni 03 Algebra + S Q L

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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

×