Esercizio 1

Si consideri il seguente schema di base di dati:

PRODOTTI(Codice, Descrizione, Marca) VENDITE(Prodotto^PRODOTTI, Anno, Quantità)

  1. 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.

  2. 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);
    
  3. Cancellare le vendite avvenute prima del 2012

    DELETE FROM Vendite WHERE Anno < 2012;
    
  4. 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'
    );
    

Esercizio 2

In riferimento allo schema proposto nell’Esercizio 1, formulare in SQL le interrogazioni per restituire:

  1. 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
    
  2. 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'
    );
    
  3. 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
    );
    
  4. 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
    );