CodL

annuncio pubblicitario
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')
) );
Scarica