Si consideri il seguente schema di base di dati:
PRODOTTI(Codice, Descrizione, Marca) VENDITE(Prodotto^PRODOTTI, Anno, Quantità)
Creare la tabella VENDITE e tutti i vincoli indicati nello schema, motivando anche la soluzione scelta per gestire l’integrità referenziale.
CREATE TABLE VENDITE(
Prodotto VARCHAR(8) REFERENCES PRODOTTI ON UPDATE CASCADE,
Anno NUMERIC(4).
Quantità NUMERIC(5) CHECK(Quantità > 0),
PRIMARY KEY(Prodotto, Anno));
Integrità referenziale: il DBMS non consente di cancellare prodotti a cui sono associate delle vendite; se viene modificato il codice di un prodotto, la modifica viene riportata nella tabella VENDITE.
Aggiungere alla tabella VENDITE un vincolo che imponga che l’attributo Quantità sia compreso tra 1 e 1000
ALTER TABLE VENDITE ADD CONSTRAINT QuantitàOK
CHECK(Quantità BETWEEN 1 AND 1000);
Cancellare le vendite avvenute prima del 2012
DELETE FROM Vendite WHERE Anno < 2012;
Aumentare di quattro unità la quantità dei prodotti di marca Barilla.
UPDATE VENDITE SET Quantità = Quantità + 4
WHERE Prodotto IN (
SELECT Codice FROM PRODOTTI WHERE Marca = 'Barilla'
);
In riferimento allo schema proposto nell’Esercizio 1, formulare in SQL le interrogazioni per restituire:
Il codice e la descrizione dei prodotti che abbiano almeno una vendita sia nel 2016 che nel 2015
SELECT Codice, Descrizione
FROM PRODOTTI JOIN VENDITE ON (Codice = Prodotto)
WHERE Anno = 2016
INTERSECT
SELECT Codice, Descrizione
FROM PRODOTTI JOIN VENDITE ON (Codice = Prodotto)
WHERE Anno = 2015
Il codice dei prodotti di marca Presolana che nel 2015 sono stati venduti in maggior quantità.
SELECT Codice FROM PRODOTTI JOIN VENDITE ON (Codice = Prodotto)
WHERE Marca = 'Presolana' AND Anno = 2015 AND
Quantità >= ALL(
SELECT Quantità FROM PRODOTTI JOIN VENDITE ON (Codice = Prodotto)
WHERE Anno = 2015 AND Marca = 'Presolana'
);
Le marche per cui tutti i loro prodotti sono stati sempre venduti in quantità maggiore di 100
SELECT Marca FROM PRODOTTI
WHERE Codice NOT IN (
SELECT Prodotto FROM VENDITE WHERE Quantità < 100
);
La descrizione e la marca dei prodotti per cui non esistono vendite nè nel 2017 nè nel 2016
SELECT Descrizione, Marca FROM Prodotti
WHERE Codice NOT IN (
SELECT Prodotto FROM VENDITE
WHERE Anno = 2016
) AND Codice NOT IN(
SELECT Prodotto FROM VENDITE
WHERE Anno = 2017
);