5. ESERCITAZIONI: Algebra relazionale e QUERY
E’ dato lo schema relazionale costituite dalle seguenti tabelle (chiave sottolineata) e dai seguenti vincoli
referenziali:
Fornitore (CodFornitore, Cognome, Nome, Data Nascita, Indirizzo, Cap, Città)
Prodotto (CodProdotto, Denominazione, Marca, Categoria, Costo)
Fornisce (CodFornitore1, CodProdotto1, DataFornitura)
con l’attributo “CodFornitore1” FK sull’attributo “CodFornitore” della relazione “Fornitore”
con l’attributo “CodProdotto1” FK sull’attributo “CodProdotto” della relazione “Prodotto”
VRCodProdotto (Prodotto)  VRCodProdotto1 (Fornisce)
Ordine (CodOrdine, Descrizione, Pezzi, DataOrdine, CodFornitore2, CodProdotto2)
con l’attributo “CodFornitore2” FK sull’attributo “CodFornitore” della relazione “Fornitore”
con l’attributo “CodProdotto2” FK sull’attributo “CodProdotto” della relazione “Prodotto”
VRCodFornitore2 (Ordine)  VRCodFornitore (Fornitore)
VRCodProdotto2 (Ordine)  VRCodProdotto (Prodotto)
Consegna (CodConsegna, Descrizione, DataConsegna CodOrdine1)
con l’attributo “CodOrdine1” FK sull’attributo “CodOrdine” della relazione “Ordine”
VRCodOrdine (Ordine)  VRCodOrdine1 (Consegna)
VRCodOrdine1 (Consegna)  VRCodOrdine (Ordine)
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 nome denominazione, marca e categoria prodotti che costano meno di 2,50 €
Q2. Trovare i nomi dei fornitori che distribuiscono prodotti della marca “GLASSEX”
Q3. Trovare i codici dei prodotti che sono forniti da almeno due fornitori
Q4. Trovare le denominazioni dei prodotti che sono forniti da almeno due fornitori
Q5. Trovare i nomi dei fornitori che forniscono almeno due prodotti presenti nel catalogo
Indirizzo
SOLUZIONI
Q1: Trovare nome marca e modello dei prodotti che costano meno di 2.50 €
SQL
SELECT Denominazione, Marca, Categoria
FROM Prodotto
WHERE Costo < 2.50;
Algebra relazionale

Denominazione, Marca, Categoria
(Costo = 2,50 (Prodotto))
Q2: Trovare i nomi dei fornitori che distribuiscono prodotti della marca “GLASSEX”
SQL
SELECT Cognome, Nome
FROM Fornitore, Fornisce, Prodotto
WHERE (Fornitore.CodFornitore=Fornisce.CodFornitore1) AND
(Fornisce.Codprodotto1=Prodotto.Codprodotto) AND (Marca = “GLASSEX”);
SELECT Cognome, Nome
FROM Fornitore INNER JOIN (Fornisce INNER JOIN Prodotto ON
Fornisce.Codprodotto1=Prodotto.Codprodotto) ON Fornitore.CodFornitore=Fornisce.CodFornitore1
WHERE (Marca= “GLASSEX”);
Algebra relazionale

Cognome, Nome,
(
Marca = “GLASSEX” ((Fornitore  Fornisce)
CodFornitore=CodFornitore1

Cognome, Nome,
( ((Fornitore  Fornisce)
CodFornitore=CodFornitore1

 Prodotto))
CodProdotto1=CodProdotto
Marca = “GLASSEX” (Prodotto)) )
CodProdotto1=CodProdotto
Q3: Trovare i codici dei prodotti che sono forniti da almeno due fornitori
SQL
SELECT CodProdotto
FROM Fornisce, Prodotto
WHERE (Fornisce.Codprodotto1=Prodotto.Codprodotto)
GROUP BY CodProdotto
HAVING COUNT(*) >= 2;
Q4: Trovare le denominazioni dei prodotti che sono forniti da almeno due fornitori
SQL
SELECT CodProdotto, Denominazione
FROM Fornitore, Fornisce, Prodotto
WHERE (Fornitore.CodFornitore=Fornisce.CodFornitore1) AND
(Fornisce.Codprodotto1=Prodotto.Codprodotto)
GROUP BY CodProdotto, Denominazione
HAVING COUNT(*) >= 2;
Q5: Trovare i nomi dei fornitori che forniscono esattamente due prodotti presenti nel
catalogo
SQL
SELECT Cognome, Nome
FROM Fornitore, Fornisce, Prodotto
WHERE (Fornitore.CodFornitore=Fornisce.CodFornitore1) AND
(Fornisce.Codprodotto1=Prodotto.Codprodotto)
GROUP BY Cognome, Nome
HAVING COUNT(*) = 2;