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;