4. ESERCITAZIONI: Algebra relazionale e QUERY E’ dato il seguente diagramma E/R di esempio: CodA Cognome Nome Autore N Titolo CodL Scrive Scrive N E’Scritto PIva Editore Libro Vende N N Vende E’Venduto Descrizione Indirizzo Città Libreria NumCopie Nazionalità Si ricava il seguente SCHEMA RELAZIONALE (MAPPING DEL DIAGRAMMA ER) Libreria (PIva, Descrizione, Indirizzo, Citta) Libro (CodL, Titolo, Editore) Vende (PIva1, CodL1, NumCopie) Con l’attributo “PIva1” FK sull’attributo “PIva” della relazione “Libreria” Con l’attributo “CodL1” FK sull’attributo “CodL” della relazione “Libro” VRPIva1 (Vende) VRPIva (Libreria) deriva dal mapping dell’associazione di molt. N:N “Vende” VRCodL1 (Vende) VRCodL (Libro) deriva dal mapping dell’associazione di molt N:N “Vende” Autore (CodA, Cognome, Nome, Nazione) Scrive (CodA1, CodL1) Con l’attributo “CodL1” FK sull’attributo “CodL” della relazione “ Libro” VRCodA1 (Scrive) VRCodA (Autore) deriva dal mapping dell’associazione di molt. N:N “Scrive” VRCodL1 (Scrive) VRCodL (Libro) deriva dal mapping dell’associazione di molt. N:N “Scrive” VRCodA (Autore) VRCodA1 (Scrive) deriva dalla TOTALITA’ della associazione diretta “Scrive” Sia data, inoltre la seguente istanza di esempio della base di dati di riferimento in un certo istante di tempo t: Autore CodA 267-41-239 274-80-939 341-22-178 409-56-700 472-27-234 Libro CodL BU1032 BU1111 BU2075 BU7832 Cognome O’Leary Jacq Eco De Carlo Gringlesby Titolo Ramses Il pendolo di Focault Il nome della rosa Basi dati Scrive CodL1 BU1032 BU1111 BU2075 BU7832 BU7832 Libreria PIva 6380 7066 7067 7044 Nome Michael Christian Umberto Andrea Burt Nazione USA F I I USA Editore Bompiani Mondadori Mondadori Esculapio CodA1 274-80-939 341-22-178 341-22-178 472-27-234 267-41-239 Descrizione Eric the Read Books Bettini Mille pagine Gulliver Indirizzo 788 Catamaugus Avenue Via Gentile 3 Viale Milano 113 Viale della libertà 5 Citta Seattle Cesena Roma Roma Vende PIva2 7067 6380 7066 7066 7066 7044 7067 CodL2 BU2075 BU7832 BU1032 BU7832 BU2075 BU1111 BU7832 NumCopie 123 356 456 1453 22 49 1560 TESTO DELLE QUERY Risolvere le seguenti interrogazioni utilizzando, se possibile, l’algebra relazionale e tradurle in SQL: Q1. Visualizzare i nomi di tutti gli autori di nazionalità italiana; Q2. Visualizzare le libreria di Roma; Q3. Selezionare l’editore del libro “Basi dati”; Q4. Trovare il codice dei libri scritti da Umberto Eco; Q5. Trovare i nomi degli autori del libro “Basi dati”; Q6. Selezionare le librerie che hanno venduto più di 100 copie del libro “il nome della rosa”; Q7. Visualizzare i libri che hanno venduto almeno una copia nella libreria “Bettini” di Cesena; Q8. Visualizzare i libri che hanno venduto almeno 10 copie nella libreria”Bettini” di Cesena; Q9. Visualizzare i libri che non hanno venduto nessuna copia nella libreria”Bettini” di Cesena; Q10. Visualizzare i libri che hanno venduto più di 50 copie in tutte le librerie di Roma; Q11. Visualizzare i libri editi da “Bompiani”; Q12. Mostrare l’indirizzo della libreria “Mille pagine” di Roma; Q13. Trovare i titoli dei libri che hanno venduto tra le 100 e le 500 copie nella libreria “Mille pagine” di Roma; Q14. Trovare il codice dei libri che hanno venduto un numero di copie maggiore di quelle vendute dal libro “Ramses” nella libreria avente partita iva “7066”; Q15. Trovare le coppie di librerie DISTINTE della stessa città; Q16. Trovare le librerie in cui è stata venduta ameno una copia di “Ramses”; Q17. Trovare le librerie in cui non è stata venduta alcuna copia di “Ramses”; Q18. Trovare le librerie in cui è stata venduta ameno una copia tra tutti i libri scritti da “Christian Jacq”; Q19. Selezionare gli autori che hanno sempre venduto almeno una copia dei loro libri presso la libreria “Bettini” di Cesena; Q20. Selezionare i nomi delle librerie in cui tutti i libri editi da “Mondadori” hanno venduto meno di 50 copie; Q21. Visualizzare i nomi degli autori che hanno pubblicato almeno 2 libri editi da “Mondadori”; Q22. Visualizzare il codice di tutti i libri scritti da più di un autore; Q23. selezionare i nomi degli autori che hanno scritto solo libri di cui sono gli autori singoli; Q24. Visualizzare il titolo del libro che ha venduto il maggior numero di copie nella città di Milano. SOLUZIONI Q1. Visualizzare i nomi di tutti gli autori di nazionalità italiana SQL SELECT Cognome, Nome FROM Autore WHERE Nazione = “I”; Algebra relazionale Cognome, Nome (Nazione =”I” (Autore)) Q2. Visualizzare le libreria di Roma; SQL SELECT * FROM Libreria WHERE Citta = “Roma”; Algebra relazionale Citta =”Roma” (Libreria) Q3. Selezionare l’editore del libro “Basi dati” SQL SELECT Editore FROM Libro WHERE Titolo = “Basi dati”; Algebra relazionale Editore (Titolo =”Base dati” (Libro)) Q4. Trovare il codice dei libri scritti da Umberto Eco SQL SELECT CodL1 FROM Autore, Scrive WHERE (Autore.CodA=Scrive.CodA1) AND (Cognome=”Eco”) AND (Nome = “Umberto”); SELECT CodL1 FROM Autore INNER JOIN Scrive ON Autore.CodA=Scrive.CodA1 WHERE (Cognome=”Eco”) AND (Nome = “Umberto”); Algebra relazionale CodL1 (Cognome=”Eco” AND Nome=”Umberto” (Autore Scrive) ) Autore.CodA = Scrive.CodA1 CodL1 ((Cognome=”Eco” AND Nome=”Umberto” (Autore)) Scrive) Autore.CodA = Scrive.CodA1 Q5. Trovare i nomi degli autori del libro “Basi dati” SQL SELECT Cognome, Nome FROM Autore, Scrive, Libro WHERE (Autore.CodA=Scrive.CodA1) AND (Scrive.CodL1=Libro.CodL) AND (Titolo = “Basi dati”); SELECT Cognome, Nome FROM Autore INNER JOIN Autore.CodA=Scrive.CodA1 WHERE (Titolo = “Basi dati”); (Scrive INNER JOIN Libro ON Scrive.CodL1=Libro.CodL) ON Algebra relazionale Cognome, Nome (Titolo=”Basi dati” (Autore Cognome, Nome ( (Autore Scrive) Autore.CodA = Scrive.CodA1 Libro) ) Scrive) Autore.CodA = Scrive.CodA1 Scrive.CodL1 = Libro.CodL Titolo=”Basi dati” (Libro) ) Scrive.CodL1 = Libro.CodL Q6. Selezionare le librerie che hanno venduto più di 100 copie del libro “il nome della rosa” SQL SELECT Descrizione, Indirizzo, Citta FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (NumCopie >= 100) AND (Titolo = “Il nome della rosa”); Algebra relazionale P = { (NumCopie >= 100) AND (Titolo = “Il nome della rosa”) } Descrizione, Indirizzo, Citta (P” (Libreria Libro) ) Vende) LibreriaPIva = Vende.PIva2 Vende.CodL2 = Libro.CodL Q7. Visualizzare i libri che hanno venduto almeno una copia nella libreria “Bettini” di Cesena SQL SELECT Titolo, Editore FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (NumCopie > 0) AND (Descrizione = “Bettini”); Algebra relazionale P = { (NumCopie > 0) AND (Descrizione = “Bettini”) } Titolo, Editore (P” (Libreria Vende) LibreriaPIva = Vende.PIva2 Libro) ) Vende.CodL2 = Libro.CodL Q8. Visualizzare i libri che hanno venduto almeno 10 copie nella libreria”Bettini” di Cesena SQL SELECT Titolo, Editore FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (NumCopie >= 10) AND (Descrizione = “Bettini”) and (Citta = “Cesena”); Algebra relazionale P = { (NumCopie >= 10) AND (Descrizione = “Bettini”) and (Citta = “Cesena”) } Titolo, Editore (P” (Libreria Libro) ) Vende) LibreriaPIva = Vende.PIva2 Vende.CodL2 = Libro.CodL Q9. Visualizzare i libri che non hanno venduto nessuna copia nella libreria”Bettini” di Cesena SELECT Titolo FROM Libreria, Vende, Libro WHERE (Libreria.PIva=Vende.PIva2) And (Vende.CodL2=Libro.CodL) And (CodL <> ALL ( SELECT CodL FROM Libreria, Vende, Libro WHERE (Libreria.PIva=Vende.PIva2) And (Vende.CodL2=Libro.CodL) (Descrizione='Bettini') And (Citta='Cesena') ) ); Q10. Visualizzare i libri che hanno venduto più di 50 copie in tutte le librerie di Roma; SQL SELECT Titolo FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (NumCopie > 50) AND (Citta = “Roma”); Algebra relazionale P = { (NumCopie > 50) AND (Citta = “Roma”) } Titolo (P” (Libreria Libro) ) Vende) LibreriaPIva = Vende.PIva2 Vende.CodL2 = Libro.CodL Q11. Visualizzare i libri editi da “Bompiani” SQL SELECT Titolo FROM Libro WHERE Editore = “Bompiani”; Algebra relazionale Titolo (Editore =”Bompiani” (Libro)) And Q12. Mostrare l’indirizzo della libreria “Mille pagine” di Roma SQL SELECT Indirizzo FROM Libreria WHERE (Descrizione = “Mille pagine”) AND (Citta = “Roma”); Algebra relazionale Indirizzo ((Descrizione =”Mille pagine”) AND (Citta = “Roma”) (Libreria)) Q13. Trovare i titoli dei libri che hanno venduto tra le 100 e le 500 copie nella libreria “Mille pagine” di Roma SQL SELECT Titolo FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (NumCopie BETWEEN 100 AND 500) AND (Descrizione = “Mille pagine”) and (Citta = “Roma”); Algebra relazionale P = { (NumCopie BETWEEN 100 AND 500) AND (Descrizione = “Mille pagine”) and (Citta = “Roma”) } Titolo (P” (Libreria Libro) ) Vende) LibreriaPIva = Vende.PIva2 Vende.CodL2 = Libro.CodL Q14. Trovare il codice ed il titolo dei libri che hanno venduto un numero di copie maggiore di quelle vendute dal libro “Ramses” nella libreria avente partita iva “7066” SQL SELECT DISTINCT CodL, Titolo FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (NumCopie > (SELECT NumCopie FROM Libro, Vende WHERE (Libro.CodL=Vende.CodL2) AND (Vende.PIva2=”7066”) AND (Titolo=”Ramses”) ) ); Q15. Trovare le coppie DISTINTE di librerie della stessa città SQL SELECT t1.Descrizione, t2.Descrizione, t2.Citta FROM Libreria AS t1, Libreria AS t2 WHERE (t1.Citta=t2.Citta) AND (t1.PIva <> t2.PIva); SELECT t1.Descrizione, t2.Descrizione, t2.Citta FROM Libreria AS t1 SELF JOIN Libreria AS t2 ON (t1.Citta=t2.Citta) WHERE (t1.PIva <> t2.PIva); Algebra relazionale P = { (t1.PIva <> t2.PIva) } t1.Descrizione, t2.Descrizione, t2.Citta (P” (Libreria Libreria) ) t1.Citta=t2.Citta Q16. Trovare le librerie in cui è stata venduta ameno una copia di “Ramses” SQL SELECT Descrizione, Indirizzo, Citta FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (NumCopie >= 1) AND (Titolo = “Ramses”); Algebra relazionale P = { (NumCopie >= 1) AND (Titolo = “Ramses”) } Descrizione, Indirizzo, Citta (P” (Libreria Libro) ) Vende) LibreriaPIva = Vende.PIva2 Vende.CodL2 = Libro.CodL Q17. Trovare le librerie in cui non è stata venduta alcuna copia di “Ramses” SELECT DISTINCT Descrizione FROM Libreria, Vende, Libro WHERE (Libreria.PIva=Vende.PIva2) And (Vende.CodL2=Libro.CodL) And (Descrizione <> (SELECT Descrizione FROM Libreria, Vende, Libro WHERE (Libreria.PIva=Vende.PIva2) And (Vende.CodL2=Libro.CodL) AND (Titolo=”Ramses”) ) ); Q18. Trovare le librerie in cui è stata venduta ameno una copia tra tutti i libri scritti da “Christian Jacq” SQL SELECT Descrizione, Indirizzo, Citta FROM Libreria, Vende, Libro, Scrive, Autore WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (Libro.CodL=Scrive.CodL1) AND (Scrive.CodA1=Autore.CodA) AND (NumCopie >= 1) AND (Cognome = “Jacq”) AND (Nome = ”Christian”); Algebra relazionale P = { (NumCopie >= 1) AND (Cognome = “Jacq”) AND (Nome=”Christian”) } Descrizione, Indirizzo, Citta (P” ((((Libreria Vende) Libro) Scrive) Autore ) ) PIva = PIva2 CodL2=CodL CodL=CodL1 CodA1=CodA Q19. Selezionare gli autori che hanno sempre venduto almeno una copia dei loro libri presso la libreria “Bettini” di Cesena SQL SELECT Cognome, Nome FROM Autore, Scrive, Libro, Vende, Libreria WHERE (Autore.CodA = Scrive.CodA1) AND (Scrive.CodL1 = Libro.CodL) AND Vende.CodL2) AND (Vende.PIva2 = Libreria.PIva) AND (NumCopie >= 1) AND (Descrizione =”Bettini”) AND (Citta=”Cesena”); (Libro.CodL Algebra relazionale P = { (NumCopie >= 1) AND (Descrizione =”Bettini”) AND (Citta=”Cesena”) } Cognome, Nome (P” ((((Autore Scrive) Libro) Vende) Libreria ) ) CodA = CodA1 CodL1=CodL CodL=CodL2 CodPIva2=CodPIva = Q20. Selezionare i nomi delle librerie in cui tutti i libri editi da “Mondadori” hanno venduto meno di 50 copie SQL SELECT Descrizione, Indirizzo, Citta FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (NumCopie <= 50) AND (Editore = “Mondadori”); Algebra relazionale P = { (NumCopie <= 50) AND (Editore = “Mondadori”) } Descrizione, Indirizzo, Citta (P” (((Libreria Vende) PIva = PIva2 Libro) ) CodL2=CodL Q21. Visualizzare i nomi degli autori che hanno pubblicato almeno 2 libri editi da “Mondadori” SQL SELECT Cognome, Nome FROM Autore, Scrive, Libro WHERE (Autore.CodA = Scrive.CodA1) AND (Scrive.CodL1=Libro.CodL) AND (Editore = “Mondadori”) GROUP BY Cognome, Nome HAVING COUNT(*) >= 2; Q22. Visualizzare il codice di tutti i libri scritti da più di un autore SQL SELECT CodL FROM Autore, Scrive, Libro WHERE (Autore.CodA = Scrive.CodA1) AND (Scrive.CodL1=Libro.CodL) GROUP BY CodL HAVING COUNT(*) >=2; Q23. selezionare i nomi degli autori che hanno scritto solo libri di cui sono gli autori singoli SQL SELECT DISTINCT Cognome, Nome FROM Autore, Scrive WHERE Autore.CodA=Scrive.CodA1 AND CodL1 <> ANY ( SELECT CodL FROM Autore, Scrive, Libro WHERE (Autore.CodA = Scrive.CodA1) AND (Scrive.CodL1=Libro.CodL) GROUP BY CodL HAVING COUNT(*) >=2 ); SELECT DISTINCT Cognome, Nome FROM Autore, Scrive WHERE Autore.CodA=Scrive.CodA1 AND CodL1 = ANY ( SELECT CodL FROM Autore, Scrive, Libro WHERE (Autore.CodA = Scrive.CodA1) AND (Scrive.CodL1=Libro.CodL) GROUP BY CodL HAVING COUNT(*)=1 ); Indirizzo Q24. Visualizzare il titolo del libro che ha venduto il maggior numero di copie nella città di Roma SQL SELECT Titolo FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (Citta='Roma') AND (NumCopie = ( SELECT MAX(Numcopie) FROM Libreria, Vende, Libro WHERE (Libreria.PIva = Vende.PIva2) AND (Vende.CodL2=Libro.CodL) AND (Citta='Roma') ) );