3. ESERCITAZIONI: Algebra relazionale e QUERY
E’ dato lo schema relazionale costituite dalle seguenti tabelle (chiave sottolineata) e dai seguenti vincoli
referenziali:
Rivista (CodR, NomeR, EditoreR)
Articolo (CodA, Titolo, Argomento, CodR1)
con l’attributo “CodR1” FK sull’attributo “CodR” della relazione Rivista
VRCodR (Rivista)  VRCodr1 (Articolo)
VRCodr1 (Articolo)  VRCodR (Rivista)
TESTO DELLE QUERY
Dopo avere ricostruito lo schema E/R risolvere le seguenti interrogazioni utilizzando, se possibile,
l’algebra relazionale e tradurle in SQL:
Q1. Trovare il titolo degli articoli di motociclismo (argomento=”MOTOCICLISMO”).
Q2. Trovare il codice delle riviste che hanno pubblicato almeno un articolo di motociclismo.
Q3. Trovare il nome delle riviste che hanno pubblicato almeno un articolo di motociclismo.
Q4. Trovare il codice delle riviste che hanno pubblicato almeno 2 articoli di motociclismo.
Q5. Trovare il nome delle riviste che hanno pubblicato almeno 2 articoli di motociclismo.
Q6. Trovare gli editori che hanno pubblicato almeno un articolo di motociclismo.
Q7. Trovare il nome delle riviste che non hanno mai pubblicato articoli di motociclismo.
Q8. Trovare gli editori che non hanno mai pubblicato articoli di motociclismo.
Q9. Trovare gli editori che hanno pubblicato solo articoli di motociclismo.
Q10. Trovare gli editori che hanno pubblicato articoli di motociclismo oppure di cinema.
Q11. Trovare gli editori che hanno pubblicato sia articoli di motociclismo sia di cinema.
Q12. Trovare gli editori che hanno pubblicato almeno 2 articoli di motociclismo.
Q13. Trovare gli editori che hanno pubblicato un solo articolo (ed uno solo) di motociclismo
(possono aver pubblicato quanti articoli desiderano relativamente ad altri argomenti).
SOLUZIONI
Q1: Trovare il titolo degli articoli di motociclismo (argomento=”MOTOCICLISMO”)
SQL
SELECT Titolo
FROM Articolo
WHERE Argomento = “MOTOCICLISMO”;
Algebra Relazionale
Titolo (Argomento =”MOTOCICLISMO” (Articolo))
Q2: Trovare il codice delle riviste che hanno pubblicato almeno un articolo di motociclismo
SQL
SELECT DISTINCT CodR1
FROM Articolo
WHERE Argomento = “MOTOCICLISMO”;
Algebra Relazionale
CodR1 (Argomento =”MOTOCICLISMO” (Articolo))
Q3: Trovare il nome delle riviste che hanno pubblicato almeno un articolo di motociclismo
SQL
SELECT DISTINCT NomeR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND
(Argomento = “MOTOCICLISMO”);
ma anche
SELECT DISTINCT NomeR
FROM Rivista INNER JOIN Articolo ON (Rivista.CodR = Articolo.CodR1)
WHERE (Argomento = “MOTOCICLISMO”);
Algebra Relazionale
NomeR (Argomento =”MOTOCICLISMO” (Rivista)  (Articolo))
Rivista.CodR = Articolo.CodR1
ma anche
NomeR ((Rivista)  Argomento =”MOTOCICLISMO” (Articolo))
Rivista.CodR = Articolo.CodR1
Q4: Trovare il codice delle riviste che hanno pubblicato almeno 2 articoli di motociclismo
SQL
SELECT CodR1 [,COUNT(*) AS numero]
FROM Articolo
WHERE (Argomento='MOTOCICLISMO')
GROUP BY CodR1
HAVING COUNT(*) >= 2;
Q5: Trovare il nome delle riviste che hanno pubblicato almeno 2 articoli di motociclismo
SQL
SELECT NomeR [,COUNT(*) AS numero]
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND
(Argomento = “MOTOCICLISMO”)
GROUP BY NomeR
HAVING COUNT(*) >= 2;
o anche
SELECT NomeR [,COUNT(*) AS numero]
FROM Rivista INNER JOIN Articolo ON (Rivista.CodR = Articolo.CodR1)
WHERE (Argomento = “MOTOCICLISMO”)
GROUP BY NomeR
HAVING COUNT(*) >= 2;
Q6: Trovare gli editori che hanno pubblicato almeno un articolo di motociclismo
SQL
SELECT DISTINCT EditoreR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND
(Argomento = “MOTOCICLISMO”);
o anche
SELECT DISTINCT EditoreR
FROM Rivista INNER JOIN Articolo ON (Rivista.CodR = Articolo.CodR1)
WHERE (Argomento = “MOTOCICLISMO”);
Algebra Relazionale
 EditoreR (Argomento =”MOTOCICLISMO” (Rivista)  (Articolo))
Rivista.CodR = Articolo.CodR1
ma anche
 EditoreR ((Rivista)  Argomento =”MOTOCICLISMO” (Articolo))
Rivista.CodR = Articolo.CodR1
Q7: Trovare il nome delle riviste che non hanno mai pubblicato articoli di motociclismo
SQL
SELECT DISTINCT NomeR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1)
AND (CodR <> ALL
(SELECT CodR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND (Argomento=”MOTOCICLISMO”)
) );
Algebra Relazionale
Q8: Trovare gli editori che non hanno mai pubblicato articoli di motociclismo
SQL
SELECT DISTINCT EditoreR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1)
AND (CodR <> ALL
(SELECT CodR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND (Argomento=”MOTOCICLISMO”)
) );
Algebra Relazionale
Q9: Trovare gli editori che hanno pubblicato solo articoli di motociclismo
SQL
SELECT DISTINCT EditoreR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1)
AND (CodR <> ALL
(SELECT CodR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND (Argomento<>”MOTOCICLISMO”)
) );
Algebra Relazionale
Q10: Trovare gli editori che hanno pubblicato articoli di motociclismo oppure di cinema
SQL
SELECT DISTINCT EditoreR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1)
AND ((Argomento = “MOTOCICLISMO”) OR (Argomento = “CINEMA”);
o anche
SELECT DISTINCT EditoreR
FROM Rivista INNER JOIN Articolo ON Rivista.CodR=Articolo.CodR1
WHERE (Argomento='MOTOCICLISMO') OR (Argomento='CINEMA');
Algebra Relazionale
Q11: Trovare gli editori che hanno pubblicato articoli SIA di motociclismo SIA di cinema
SQL
SELECT DISTINCT EditoreR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND (Argomento=”MOTOCICLISMO”)
INTERSECT
SELECT DISTINCT EditoreR
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND (Argomento=”CINEMA”);
Algebra Relazionale
Q12: Trovare gli editori che hanno pubblicato almeno 2 articoli di motociclismo
SQL
SELECT EditoreR [,COUNT(*) AS numero]
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND (Argomento = “MOTOCICLISMO”)
GROUP BY EditoreR
HAVING COUNT(*) >= 2;
Indirizzo
o anche
SELECT EditoreR [,COUNT(*) AS numero]
FROM Rivista INNER JOIN Articolo ON (Rivista.CodR = Articolo.CodR1)
WHERE (Argomento = “MOTOCICLISMO”)
GROUP BY EditoreR
HAVING COUNT(*) >= 2;
Algebra Relazionale
Q13: Trovare gli editori che hanno pubblicato un solo articolo (ed uno solo) di
motociclismo (possono aver pubblicato quanti articoli desiderano relativamente ad altri
argomenti)
SQL
SELECT EditoreR [,COUNT(*) AS numero]
FROM Rivista, Articolo
WHERE (Rivista.CodR = Articolo.CodR1) AND (Argomento = “MOTOCICLISMO”)
GROUP BY EditoreR
HAVING COUNT(*)= 1;
Algebra Relazionale