Si consideri il seguente schema di base di dati:
ATTORI(CodAttore, Nome, AnnoNascita, Nazionalità) RECITA(CodAttore(ATTORI), CodFilm(FILM)) FILM(CodFilm, Titolo, AnnoProduzione, Nazionalità, Regista, Genere)
Scrivere i comandi SQL per:
Creare la tabella RECITA specificando gli opportuni vincoli di integrità e le opzioni per gestire l’integrità referenzia (motivando le scelte effettuate per la gestione dell’integrità referenziale)
CREATE TABLE RECITA(
codAttore NUMERIC(5),
codFilm NUMERIC(5),
PRIMARY KEY (codAttore, codFilm),
FOREIGN KEY codAttore REFERENCES ATTORI(codAttore)
ON UPDATE CASCADE
ON DELETE CASCADE,
FOREIGN KEY codFilm REFERENCES FILM(codFilm)
ON UPDATE CASCADE
ON DELETE CASCADE
);
Aggiungere alla tabella FILM un vincolo che specifichi che l’attributo anno di produzione deve essere compreso tra il 1950 e il 2018
ALTER TABLE FILM ADD CONSTRAINT vincolo1
CHECK(annoProduzione BETWEEN 1950 AND 2018);
Creare una vista che contenga solo i film di Genere comico prodotti nel 2010
CREATE VIEW vista1 AS(
SELECT * FROM FILM
WHERE genere = 'comico' AND annoProduzione = 2010
)
Aggiungere la colonna telefono alla tabella ATTORI
ALTER TABLE ATTORI
ADD COLUMN telefono VARCHAR(25)
Formulare in SQL le interrogazioni per restituire:
Il codice degli attori che hanno recitato in tutti i film del regista Francis Ford Coppola
SELECT codAttore
FROM ATTORI NATURAL JOIN RECITA NATURAL JOIN FILM
WHERE regista = 'Francis Ford Coppola'
GROUP BY codAttore
HAVING COUNT(*) = (
SELECT COUNT(*)
FROM FILM
WHERE regista = 'Francis Ford Coppola'
)
Il numero di attori che hanno recitato in ogni film, per i film del 2010 in cui hanno recitato almeno due attori
-- Q1: codici dei film del 2010 in cui hanno recitato
-- almeno due attori
SELECT CodFilm
FROM RECITA NATURAL JOIN FILM
WHERE AnnoProduzione = 2010
GROUP BY CodFilm
HAVING COUNT(CodAttore) >= 2;
SELECT COUNT(codAttore)
FROM RECITA
WHERE codAttore IN(
SELECT codAttore FROM RECITA
WHERE codFilm IN Q1
GROUP BY codAttore
HAVING COUNT(*)=(
SELECT COUNT(*)
FROM FILM
WHERE codFilm IN Q1
)
)
Il codice ed il nome degli attori che hanno recitato in film della loro stessa nazionalità
SELECT codAttore, nome
FROM ATTORI NATURAL JOIN RECITA NATURAL JOIN FILM
WHERE ATTORI.nazionalità = FILM.nazionalità
GROUP BY codAttore, nome
Il titolo dei film senza attori
-- troviamo il numero di attori per ogni film
-- vogliamo solo i film dove il numero di attori è 0
SELECT titolo
FROM FROM ATTORI NATURAL JOIN RECITA NATURAL JOIN FILM
GROUP BY codFilm, titolo
WHERE COUNT(codAttore) = 0
-- SELECT CodFilm FROM FILM MINUS SELECT CodFilm FROM RECITA;