2. ESERCITAZIONI: Algebra relazionale e QUERY
E’ dato il seguente diagramma E/R di esempio:
TESTO DELLE QUERY
Risolvere le seguenti interrogazioni utilizzando, se possibile, l’algebra relazionale e tradurle in SQL:
Q1: Ottenere solo il nome ed il cognome degli studenti
Q2: Ottenere tutti i dati relativi agli studenti che hanno più di 16 anni
Q3: Ottenere il nome ed il cognome di tutti gli studenti della 5H che hanno almeno 17 anni
Q4: Ottenere tutti gli studenti della 5H che non si chiamano “Gennaro”
Q5: Ottenere il nome ed il cognome degli studenti che hanno svolto almeno una prova di
‘INFORMATICA’ (senza ripetizioni)
Q6: Ottenere il nome, il cognome dei docenti ed il numero di prove da essi effettuate
Q7: Ottenere il nome ed il cognome degli studenti che hanno riportato in almeno una prova la
sufficienza.
Q8: Elencare tutte le classi cui appartengono gli studenti
Q9: Elencare tutte le classi cui appartengono gli studenti in ordine alfabetico (crescente è il
default)
Q10: Elencare tutte le classi cui appartengono gli studenti in ordine alfabetico (decrescente
per classe e per sezione)
Q11: Elencare il nome dei docenti che hanno svolto prove in “INFORMATICA”
Q12: Elencare la materia delle prove ed il nome dei docenti che hanno assegnato un voto alla
studentessa “MARIA” “LATELLA”
Q13: Elencare i docenti che hanno il cognome che inizia con la lettera ‘M’
Q14: Ottenere tutti i dati relativi agli studenti che hanno un età compresa tra 17 e 19 anni
ordinati per classe di appartenenza decrescente
Q15: Dire quanti sono gli studenti che hanno un età compresa tra 17 e 19 anni
Q16: Dire quanti sono gli studenti per ciascuna classe di appartenenza
Q17: Dire quanti sono gli studenti per ciascuna classe di appartenenza mettendo le classi in
ordine decrescente
Q18: Dire qual è la media tra le età di tutti gli studenti
Q19: Dire qual è l’età media di ciascuna classe/sezione
Q20: Dire qual è la somma delle età di tutti i docenti
SOLUZIONI
Q1: Ottenere solo il nome ed il cognome degli studenti
SQL
SELECT NomeS, CognomeS
FROM Studente;
Algebra Relazionale
NomeS, CognomeS (Studente)
Q2: Ottenere tutti i dati relativi agli studenti che hanno più di 16 anni
SQL
SELECT *
FROM Studente
WHERE AnniS >= 16;
Algebra Relazionale

AnniS >= 16
(Studente)
Q3: Ottenere il nome ed il cognome di tutti gli studenti della 5H che hanno almeno 17 anni
SQL
SELECT NomeS, CognomeS
FROM Studente
WHERE AnniS >= 17
AND ClasseS = 5
AND SezioneS = 'H';
Algebra Relazionale
NomeS, CognomeS
(
AnniS >= 17 AND ClasseS = 5 AND SezioneS = ‘H’
(Studente)
)
Q4: Ottenere tutti gli studenti della 5H che non si chiamano “Gennaro”
SQL
SELECT *
FROM Studente
WHERE NomeS <> “Gennaro”
AND ClasseS = 5
AND SezioneS = 'H';
Algebra Relazionale

NomeS <>”Gennaro” AND ClasseS = 5 AND SezioneS = ‘H’
(Studente)
Q5: Ottenere il nome ed il cognome degli studenti che hanno svolto almeno una prova di
‘INFORMATICA’ (senza ripetizioni)
SQL
SELECT DISTINCT Studente.NomeS, Studente.CognomeS
FROM Studente, Svolge, Prova
WHERE Studente.IdS = Svolge.IdS1
AND Svolge.IdP1 = Prova.IdP
AND Prova.MateriaP = 'INFORMATICA';
ma anche
SELECT DISTINCT Studente.NomeS, Studente.CognomeS
FROM Studente INNER JOIN (Svolge INNER JOIN Prova ON Svolge.IdP1 = Prova.IdP)
ON Studente.IdS = Svolge.IdS1
WHERE Prova.MateriaP = 'INFORMATICA';
Algebra Relazionale
NomeS, CognomeS
(P (Prova  (Studente  Svolge)) )
IdP = IdP1
IdS = IdS1
con P =  MateriaP = ‘INFORMATICA’ 
ma anche
NomeS, CognomeS, Voto
(P (Prova)  (Studente  Svolge)) )
IdP = IdP1
IdS = IdS1
con P =  MateriaP = ‘INFORMATICA’ 
Q6: Ottenere il nome, il cognome dei docenti ed il numero di prove da essi effettuate
SQL
SELECT CognomeD, NomeD, Count(*) As Numero
FROM Docente, Prova
WHERE Docente.IdD = Prova.IdD1
GROUP BY CognomeD, NomeD;
Q7: Ottenere il nome ed il cognome degli studenti che hanno riportato in almeno una prova
la sufficienza.
SQL
SELECT Studente.NomeS, Studente.CognomeS, Svolge.Voto
FROM Studente, Svolge, Prova
WHERE Studente.IdS = Svolge.IdS1
AND Svolge.IdP1 = Prova.IdP
AND Svolge.Voto >= 6;
ma anche
SELECT Studente.NomeS, Studente.CognomeS, Svolge.Voto
FROM Studente INNER JOIN (Svolge INNER JOIN Prova ON Svolge.IdP1 = Prova.IdP)
ON Studente.IdS = Svolge.IdS1
WHERE Svolge.Voto >= 6;
Algebra Relazionale
NomeS, CognomeS, Voto
(P (Prova  (Studente  Svolge)) )
IdP = IdP1
IdS = IdS1
con P =  Voto >= 6 
ma anche
NomeS, CognomeS, Voto
(Prova  (Studente  P (Svolge)) )
IdP = IdP1
con P =  Voto >= 6 
IdS = IdS1
Q8: Elencare tutte le classi cui appartengono gli studenti
SQL
SELECT DISTINCT Studente.ClasseS, Studente.SezioneS
FROM Studente;
Algebra Relazionale
ClasseS, SezioneS (Studente)
Q9: Elencare tutte le classi cui appartengono gli studenti in ordine alfabetico (crescente è il
default)
SQL
SELECT DISTINCT Studente.ClasseS, Studente.SezioneS
FROM Studente
ORDER BY ClasseS;
Algebra Relazionale
Come sopra
Q10: Elencare tutte le classi cui appartengono gli studenti in ordine alfabetico (decrescente
per classe e per sezione)
SQL
SELECT DISTINCT Studente.ClasseS, Studente.SezioneS
FROM Studente
ORDER BY ClasseS DESC, SezioneS DESC;
Algebra Relazionale
Come sopra
Q11: Elencare il nome dei docenti che hanno svolto prove in “INFORMATICA”
SQL
SELECT Docente.NomeD, Docente.CognomeD
FROM Docente, Prova
WHERE IdD = IdD1
AND Prova.MateriaP = “INFORMATICA”;
ma anche
SELECT Docente.NomeD, Docente.CognomeD
FROM Docente INNER JOIN Prova ON Docente.IdD = Prova.IdD1
WHERE MateriaP = “INFORMATICA”;
Algebra Relazionale
NomeD, CognomeD
(P (Docente  Prova) )
IdD = IdD1
con P =  MateriaP = “INFORMATICA” 
ma anche
NomeS, CognomeS, Voto
(Docente  P (Prova) )
IdD = IdD1
con P =  MateriaP = “INFORMATICA” 
Q12: Elencare la materia delle prove ed il nome dei docenti che hanno assegnato un voto
alla studentessa “MARIA” “LATELLA”
SQL
SELECT Docente.NomeD, Docente.CognomeD, Prova.MateriaP
FROM Docente, Prova, Svolge, Studente
WHERE Docente.IdD = Prova.IdD1
AND Prova.IdP = Svolge.IdP1
AND Svolge.IdS1 = Studente.IdS
AND Studente.NomeS = “MARIA” AND Studente.CognomeS = “LATELLA”;
ma anche
SELECT Docente.NomeD, Docente.CognomeD, Prova.MateriaP
FROM Studente INNER JOIN (Svolge INNER JOIN (Docente INNER JOIN Prova
ON Docente.IdD = Prova.IdD1)
ON Prova.IdP = Svolge.IdP1)
ON Studente.IdS = Svolge.IdS1
WHERE Studente.NomeS = “MARIA” AND Studente.CognomeS = “LATELLA”;
Algebra Relazionale
NomeS, CognomeS, MateriaP
(P ( Studente  (Svolge  (Docente  Prova)) ))
IdS = IdS1
IdP1 = IdP
IdD = IdD1
con P =  NomeS = ‘MARIA’ AND CognomeS = “LATELLA” 
ma anche
NomeS, CognomeS, MateriaP
(P ( Studente )  (Svolge  (Docente  Prova)) ))
IdS = IdS1
IdP1 = IdP
IdD = IdD1
con P =  NomeS = “MARIA” AND CognomeS = ”LATELLA” 
Q13: Elencare i docenti che hanno il cognome che inizia con la lettera ‘M’
SQL
SELECT *
FROM Docente
WHERE NomeD LIKE “M*”;
Algebra Relazionale

NomeD LIKE “M*”
(Docente)
Q14: Ottenere tutti i dati relativi agli studenti che hanno un età compresa tra 17 e 19 anni
ordinati per classe di appartenenza decrescente
SQL
SELECT *
FROM Studente
WHERE AnniS BETWEEN 17 AND 19
ORDER BY ClasseS DESC;
Algebra Relazionale

(AnniS >= 17) AND (AnniS <= 19)
(Studente)
Indirizzo
Q15: Dire quanti sono gli studenti che hanno un età compresa tra 17 e 19 anni
SQL
SELECT COUNT(*) As Numero
FROM Studente
WHERE AnniS BETWEEN 17 AND 19;
Q16: Dire quanti sono gli studenti per ciascuna classe di appartenenza
SQL
SELECT ClasseS, SezioneS, COUNT(*) As Numero
FROM Studente
GROUP BY ClasseS, SezioneS;
Q17: Dire quanti sono gli studenti per ciascuna classe di appartenenza mettendo le classi
in ordine decrescente
SQL
SELECT ClasseS, SezioneS, COUNT(*) As Numero
FROM Studente
GROUP BY ClasseS, SezioneS
ORDER BY ClasseS DESC, SezioneS DESC;
Q18: Dire qual è la media tra le età di tutti gli studenti
SQL
SELECT AVG (AnniS) AS Media
FROM Studente;
Q19: Dire qual è l’età media di ciascuna classe/sezione
SQL
SELECT ClasseS, SezioneS, AVG (AnniS) AS Media
FROM Studente
GROUP BY ClasseS, SezioneS;
Q20: Dire qual è la somma delle età di tutti i docenti
SQL
SELECT SUM (AnniD) AS Somma
FROM Docente;