6. ESERCITAZIONI: Algebra relazionale e QUERY
E’ dato il seguente diagramma E/R di esempio:
CodReg NomeReg
Regione
CodProv
Ha
1
Ha
N
E’Avuta
NomeProv
Possiede
1
Provincia
Possiede
1
Risiede
CodComm
NomeComm
Presiede
Commissione
1
E’Presieduta
E’Posseduto
1
N
Presiede
Deputato
Elegge
N
Elegge
1
E’Eletto
N
Collegio
Cap
CodDep
Indirizzo
Cognome
Città
Nome
CodColl
NomeColl
NumColl
l
Si ricava il seguente SCHEMA RELAZIONALE (MAPPING DEL DIAGRAMMA ER)
Regione (CodReg, NomeReg)
Provincia (CodProv, NomeProv, CodReg1)
con l’attributo “CodReg1” FOREIGN KEY sull’attributo “CodReg” della relazione “Regione”
VRCodReg (Regione)  VRCodReg1 (Provincia) deriva dalla TOTALITA’ dell’associazione diretta “Ha”
VRCodReg (Regione)  VRCodReg1 (Provincia) deriva dalla TOTALITA’ dell’associazione inversa “E’Avuta”
Collegio (CodColl, NumColl, NomeColl, CodProv1)
con l’attributo “CodProv1” FOREIGN KEY sull’attributo “CodProv” della relazione “Provincia”
VRCodProv1 (Collegio)  VRCodProv (Provincia) deriva dalla TOTALITA’ dell’associazione inversa “E’Posseduto”
Deputato (CodDep, Cognome, Nome, Indirizzo, Cap, Città, CodComm1, CodProv2, CodColl1, NumColl1)
con l’attributo “CodComm1” FOREIGN KEY sull’attributo “CodComm” della relazione “Commissione”
con l’attributo “CodProv2” FOREIGN KEY sull’attributo “CodProv” della relazione “Provincia”
con gli attributi “CodColl1” e “NumColl1” FK sugli attributi “CodColl” e “NumColl” della relazione “Collegio”
VRCodColl, NumColl (Collegio)  VRCodColl1, NumColl1 (Deputato) deriva dalla TOTALITA’ dell’associazione diretta “Elegge”
VRCodColl, NumColl (Collegio)  VRCodColl1, NumColl1 (Deputato) deriva dalla TOTALITA’ dell’ass. inversa “E’Eletto”
VRCodProv2 (Deputato)  VRCodProv (Provincia) deriva dalla TOTALITA’ dell’associazione diretta “Risiede”
Commissione (CodComm, NomeComm)
VRCodComm (Commissione)  VRCodComm1 (Deputato) deriva dalla TOTALITA’ dell’ass. inversa “E’Presieduta”
Si ricava il seguente SCHEMA TABELLE IN SQL (TRADUZIONE DELLO SCHEMA RELAZIONALE IN SQL)
Lo schema di base di dati di riferimento assegnato tradotto in SQL sarà:
TABLE Regione
(
CodReg
CHAR (3) NOT NULL,
NomeReg
CHAR (50) NOT NULL,
PRIMARY KEY (CodReg)
);
TABLE Provincia
(
CodProv
CHAR (2) NOT NULL,
NomeProv
CHAR 50) NOT NULL,
CodReg1
CHAR (3) NOT NULL,
PRIMARY KEY (CodProv),
FOREIGN KEY (CodReg1) REFERENCES Regione (CodReg)
);
TABLE Collegio
(
CodColl
CHAR (2) NOT NULL,
NumColl
INT NOT NULL,
NomeColl
CHAR (50) NOT NULL,
CodProv1
CHAR (2)
PRIMARY KEY (CodColl, NumColl),
FOREIGN KEY (CodProv1) REFERENCES Provincia (CodProv)
);
TABLE Commissione
(
CodComm
CHAR (3) NOT NULL,
NomeComm
CHAR (50) NOT NULL,
PRIMARY KEY (CodComm),
);
TABLE Deputato
(
CodDep
CHAR (4) NOT NULL,
Cognome
CHAR (30) NOT NULL,
Nome
CHAR (30) NOT NULL,
Indirizzo
CHAR (50),
Cap
CHAR (5),
Città
CHAR (30),
CodComm1
CHAR (3),
CodProv2
CHAR (2) NOT NULL,
CodColl1
INT NOT NULL,
NumColl1
INT NOT NULL,
PRIMARY KEY (CodDep),
FOREIGN KEY (CodComm1) REFERENCES Commissione (CodComm),
FOREIGN KEY (CodProv2) REFERENCES Provincia (CodProv),
FOREIGN KEY (CodColl1, NumColl1) REFERENCES Collegio (CodColl, NumColl)
);
Sia data, inoltre la seguente istanza di esempio della base di dati di riferimento in un certo istante di
tempo t:
Regione CodReg
BAS
PIE
CAM
PUG
TRE
NomeReg
Basilicata
Piemonte
Campania
Puglia
Trentino
Provincia CodProv
PZ
TO
BA
BZ
NA
Collegio CodColl
PZ
PZ
TO
TO
Deputato
NomeProv
Potenza
Torino
Bari
Bolzano
Napoli
NumColl
1
2
1
2
CodReg1
BAS
PIE
PUG
TRE
CAM
NomeColl
Melfi
Lagonegro
Settimo Torinese
Ivrea
CodProv1
PZ
PZ
TO
TO
CodDep
Cognome
Nome
Indirizzo
Cap
Città
SG01
RM02
FF03
SA04
BR05
BR06
Silvestro
Rossi
Filippi
Stabile
Biase
Verdi
Giuseppe
Mario
Francesca
Giuseppe
Roberto
Andrea
Via Po, 5
Via Riace, 1
Via Busi, 2
Via Isotta, 4
Via Berg, 5
Via Piave, 7
80125
39100
10010
85100
70126
80125
Napoli
Bolzano
Torino
Potenza
Bari
Napoli
Commissione CodComm
BIL
AFF
CUL
CodComm
1
NULL
CUL
NULL
AFF
NULL
BIL
CodProv
2
NA
BZ
TO
PZ
BA
NA
CodColl
1
PZ
TO
TO
PZ
PZ
PZ
NumColl
1
1
2
1
2
1
2
NomeComm
Bilancio
Affari Costituzionali
Cultura
TESTO DELLE QUERY: Risolvere le seguenti interrogazioni utilizzando, se possibile, l’algebra relazionale e
tradurle in SQL:
Q1: Visualizzare i nomi delle commissioni (livello di difficoltà: basso).
Q2: Elencare i nomi delle commissioni in ordine alfabetico (livello di difficoltà: basso).
Q3: Visualizzare i cognomi ed i nomi dei deputati (livello di difficoltà: basso).
Q4: Visualizzare i cognomi ed i nomi dei deputati che risiedono a Napoli (livello di difficoltà:
medio).
Q5: Visualizzare il cognome dei deputati che risiedono a Napoli e che si chiamano “Giuseppe”
(livello di difficoltà: medio).
Q6: Estrarre i nomi e i cognomi dei deputati eletti in collegi della provincia di Potenza (livello
di difficoltà: basso).
Q7: Estrarre i nomi e i cognomi dei deputati eletti con l’indicazione del collegio nel quale è
avvenuta l’elezione ordinati per Cognome in senso crescente e Nome descrescente(livello di
difficoltà: medio)
Q8: Estrarre i nomi e i cognomi dei deputati eletti con l’indicazione del collegio nel quale è
avvenuta l’elezione e che sono nati a Napoli (livello di difficoltà: medio).
Q9: Estrarre una tabella contenente tutti i nomi delle province e tutti i nomi delle regioni
(livello di difficoltà: basso).
Q10: Estrarre i nomi di tutte le commissioni con i cognomi e i nomi dei relativi presidenti,
chiamando gli attributi del risultato rispettivamente NomeCommissione, CognomePresidente,
NomePresidente (livello di difficoltà: medio).
Q11: Elencare i nomi e cognomi dei deputati eletti nelle regioni del centro Italia che non siano
presidenti di commissione. (livello di difficoltà: medio)
Q12: Estrarre una tabella contenente, per ogni provincia, il numero di deputati eletti nei collegi
di quella provincia (livello di difficoltà: medio)
SOLUZIONI
Q1: Visualizzare i nomi delle commissioni (livello di difficoltà: basso).
SQL
SELECT NomeComm
FROM Commissione
Algebra relazionale

NomeComm
(Commissione)
Q2: Elencare i nomi delle commissioni in ordine alfabetico DECRESCENTE(livello di
difficoltà: basso).
SQL
SELECT NomeComm
FROM Commissione
ORDER BY NomeComm DESC
Q3: Visualizzare i cognomi ed i nomi dei deputati (livello di difficoltà: basso).
SQL
SELECT Cognome, Nome
FROM Deputato
Algebra relazionale

Cognome, Nome
(Deputato)
Q4: Visualizzare i cognomi ed i nomi dei deputati che risiedono a Napoli (livello di
difficoltà: medio)
SQL
SELECT Cognome, Nome
FROM Deputato
WHERE (CodProv2 = “NA”)
Algebra relazionale

Cognome, Nome
(CodProv2 = “NA” (Deputato))
Q5: Visualizzare il cognome dei deputati che risiedono a Napoli e che si chiamano
“Giuseppe” (livello di difficoltà: medio)
SQL
SELECT Cognome, Nome
FROM Deputato
WHERE (CodProv2 = “NA”) AND (Nome = “Giuseppe”)
Algebra relazionale

Cognome, Nome
(CodProv2 = “NA” AND Nome = “Giuseppe” (Deputato) )
Q6: Estrarre i nomi e i cognomi dei deputati eletti con l’indicazione del collegio nel quale è
avvenuta l’elezione (livello di difficoltà: medio).
SQL
SELECT Cognome, Nome, NomeColl
FROM Deputato INNER JOIN Collegio ON (CodColl1 = CodColl) AND (NumColl1 = NumColl)
o anche
SELECT Cognome, Nome, NomeColl
FROM Deputato, Collegio
WHERE (CodColl1 = CodColl) AND (NumColl1 = NumColl)
Algebra relazionale

Cognome, Nome, NomeColl
(Deputato

Collegio)
(CodColl1=CodColl) AND (NumColl1=NumColl)
Q7: Estrarre i nomi e i cognomi dei deputati eletti con l’indicazione del collegio nel quale è
avvenuta l’elezione ordinati per Cognome in senso crescente e Nome descrescente(livello
di difficoltà: medio).
SQL
SELECT Cognome, Nome, NomeColl
FROM Deputato INNER JOIN Collegio ON (CodColl1 = CodColl) AND (NumColl1 = NumColl)
ORDER BY Cognome ASC , Nome DESC
O anche
SELECT Cognome, Nome, NomeColl
FROM Deputato, Collegio
WHERE (CodColl1 = CodColl) AND (NumColl1 = NumColl)
ORDER BY Cognome ASC , Nome DESC
Q8: Estrarre i nomi e i cognomi dei deputati eletti con l’indicazione del collegio nel quale è
avvenuta l’elezione e che sono nati a Napoli (livello di difficoltà: medio).
SQL
SELECT Cognome, Nome, NomeColl
FROM Deputato INNER JOIN Collegio ON (CodColl1 = CodColl) AND (NumColl1 = NumColl)
WHERE (Città = “Napoli”)
O anche
SELECT Cognome, Nome, NomeColl
FROM Deputato, Collegio
WHERE (CodColl1 = CodColl) AND (NumColl1 = NumColl) AND (Città = “Napoli”)
Algebra relazionale

Cognome, Nome, NomeColl
( Città = “Napoli” (Deputato

Collegio) )
(CodColl1=CodColl) AND (NumColl1=NumColl)

Cognome, Nome, NomeColl
(Città = “Napoli” (Deputato)

Collegio)
(CodColl1=CodColl) AND (NumColl1=NumColl)
Q9: Estrarre una tabella contenente tutti i nomi delle province e tutti i nomi delle regioni
(livello di difficoltà: basso).
SQL
SELECT Regione.NomeReg, Provincia.NomeProv
FROM Regione INNER JOIN Provincia ON Regione.CodReg=Provincia.CodReg1
ORDER BY Regione.NomeReg, Provincia.NomeProv;
Q10: Estrarre i nomi di tutte le commissioni con i cognomi e i nomi dei relativi presidenti,
chiamando gli attributi del risultato rispettivamente NomeCommissione,
CognomePresidente, NomePresidente (livello di difficoltà: medio).
SQL
SELECT Commissione.NomeComm AS NomeCommissione, Deputato.Cognome AS CognomePresidente,
Deputato.Nome AS NomePresidente
FROM Deputato INNER JOIN Commissione ON Deputato.CodComm1=Commissione.CodComm
ORDER BY Commissione.NomeComm;
Indirizzo
Q11: Elencare i nomi e cognomi dei deputati eletti nelle regioni del sud Italia Campania,
Basilicata e Puglia che non siano presidenti di commissione. (livello di difficoltà: medio)
SQL
SELECT Deputato.Cognome, Deputato.Nome
FROM Deputato INNER JOIN (Provincia INNER JOIN Regione ON
Provincia.CodReg1=Regione.CodReg) ON Deputato.CodProv2=Provincia.CodProv
WHERE (((Regione.NomeReg='Basilicata') Or (Regione.NomeReg='Campania') Or
(Regione.NomeReg='Puglia')) And (CodComm1 IS NULL));
Q12: Estrarre una tabella contenente, per ogni provincia, il numero di deputati eletti nei
collegi di quella provincia (livello di difficoltà: medio)
SQL
SELECT Provincia.NomeProv, COUNT(*) AS NumeroDeputatiEletti
FROM Deputato INNER JOIN Provincia ON Deputato.CodProv2=Provincia.CodProv
GROUP BY Provincia.NomeProv;