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