Si consideri il seguente schema di base di dati:
QUIZ(CodQuiz, Argomento, Punteggio) STUDENTE(Matricola, Nome, Indirizzo, Città) RISULTATOTEST(Matricola, CodQuiz, Esito, Data)
L’attributo Esito può assumere come valore superato/non superato ed indica l’esito del quiz.
Scrivere i comandi SQL per:
Creare la tabella RISULTATOTEST specificando gli opportuni vincoli di integrità e le opzioni per gestire l’integrità referenziale (motivando le scelte effettuate per la gestione dell’integrità referenziale)
CREATE TABLE RISULTATOTEST(
Matricola NUMERIC(7) REFERENCES STUDENTE(Matricola)
ON UPDATE CASCADE
ON DELETE CASCADE,
CodQuiz VARCHAR(4) REFERENCES QUIZ(CodQuiz)
ON UPDATE CASCADE
ON DELETE RESTRICT,
Esito VARCHAR(12) NOT NULL CHECK IN('Superato','Non superato'),
Data DATE NOT NULL,
PRIMARY KEY (Matricola, CodQuiz)
);
Se viene modificata la matricola di uno studente o il codice di un quiz nelle tabelle QUIZ/STUDENTE le modifiche vengono propagate alla tabella RISULTATOTEST. Se si cancella uno studente, vengono cancellate anche le informazioni sui test a cui ha preso parte. Non viene consentita la cancellazione di un quiz se ci sono ancora informazioni a lui relative nella tabella RISULTATOTEST.
Cancellare gli studenti che non hanno sostenuto test dopo l’1/1/2010
DELETE FROM STUDENTE
WHERE Matricola NOT IN(
SELECT Matricola
FROM STUDENTE NATURAL JOIN RISULTATOTEST
WHERE Data > '1/1/2010' DATE
);
Aumentare di due unità il punteggio dei quiz di Informatica
UPDATE QUIZ SET Punteggio = Punteggio + 2
WHERE Argomento = 'Informatica';
Aggiungere alla tabella STUDENTE l’attributo obbligatorio email
ALTER TABLE STUDENTE ADD COLUMN email VARCHAR(30) NOT NULL
DEFAULT '[email protected]';
Il nome e la matricola degli studenti di Como che nel Gennaio del 2017 hanno risposto correttamente ad almeno un quiz di Informatica
SELECT Nome, Matricola FROM STUDENTI
WHERE Città = 'Como' AND Matricola IN(
SELECT Matricola
FROM RISULTATOTEST NATURAL JOIN QUIZ
WHERE Argomento = 'Informatica' AND Esito = 'Superato'
AND Data > '1/1/2017' DATE
AND Data < '31/1/2017' DATE
);
Il nome degli studenti di Varese che hanno svolto tutti i quiz di matematica
SELECT Nome FROM STUDENTE
WHERE Città = 'Varese' AND Matricola IN (
SELECT Matricola
FROM RISULTATOTEST NATURAL JOIN QUIZ
WHERE Argomento = 'Matematica'
GROUP BY Matricola
HAVING COUNT(*) = (
SELECT COUNT(*) FROM QUIZ
WHERE Argomento = 'Matematica'
)
);
I quiz a cui hanno partecipato almeno 20 studenti, ciascuno dei quali abbia superato almeno 10 quiz di biologia
SELECT CodQuiz FROM RISULTATOTEST
WHERE Matricola IN(
SELECT Matricola
FROM RISULTATOTEST NATURAL JOIN QUIZ
WHERE Esito = 'Superato' AND Argomento = 'Biologia'
GROUP BY Matricola
HAVING COUNT(*) >= 10
)
GROUP BY CodQuiz
HAVING COUNT(*) >= 20;
Il nome degli studenti che hanno superato con successo sia quiz di matematica che di informatica ma mai quelli di fisica
SELECT Nome
FROM STUDENTI NATURAL JOIN RISULTATOTEST NATURAL JOIN QUIZ
WHERE Argomento = 'Matematica' AND Esito = 'Superato'
INTERSECT
SELECT Nome
FROM STUDENTI NATURAL JOIN RISULTATOTEST NATURAL JOIN QUIZ
WHERE Argomento = 'Informatica' AND Esito = 'Superato'
EXCEPT
SELECT Nome
FROM STUDENTI NATURAL JOIN RISULTATOTEST NATURAL JOIN QUIZ
WHERE Argomento = 'Fisica' AND Esito = 'Superato'