© Your Copyright
A partir du modèle de données crée par les commandes SQL :
CREATE TABLE personnes ( personne_id INTEGER PRIMARY KEY AUTOINCREMENT,
nom VARCHAR(20),
prenom VARCHAR(20),
pays VARCHAR(20) DEFAULT 'France' );
CREATE TABLE films ( film_id INTEGER PRIMARY KEY AUTOINCREMENT,
realisateur_id INTEGER NOT NULL,
titre VARCHAR(50),
genre VARCHAR(10),
annee INTEGER,
FOREIGN KEY (realisateur_id) REFERENCES personnes(personne_id) );
CREATE TABLE roles ( film_id INTEGER NOT NULL,
acteur_id INTEGER NOT NULL,
role VARCHAR(20),
PRIMARY KEY (film_id,acteur_id),
FOREIGN KEY (acteur_id) REFERENCES personnes(personne_id) ,
FOREIGN KEY (film_id) REFERENCES films);
En ayant inséré les informations suivantes dans la base de données :
INSERT INTO personnes(nom,prenom)
VALUES ('De Niro', 'Robert');
INSERT INTO personnes(nom,prenom)
VALUES ('Scorsese', 'Martin');
INSERT INTO personnes(nom,prenom)
VALUES ('Eastwood', 'Clint');
INSERT INTO personnes(nom,prenom)
VALUES ('Leone', 'Sergio');
INSERT INTO personnes(nom,prenom)
VALUES ('Freeman', 'Morgan');
INSERT INTO films(realisateur_id,titre,genre,annee)
VALUES (2, 'Taxi Driver', 'Drame',1976);
INSERT INTO films(realisateur_id,titre,genre,annee)
VALUES (3, 'Impitoyable', 'Western',1992);
INSERT INTO films(realisateur_id,titre,genre,annee)
VALUES (4, 'Pour une poignée de dollars', 'Western',1964);
INSERT INTO roles(film_id,acteur_id,role )
VALUES (1,1, 'Travis');
INSERT INTO roles(film_id,acteur_id,role )
VALUES (1,2, 'client');
INSERT INTO roles(film_id,acteur_id,role )
VALUES (2,3, 'Munny');
INSERT INTO roles(film_id,acteur_id,role )
VALUES (3,3, 'Logan');
INSERT INTO roles(film_id,acteur_id,role )
VALUES (2,5, 'Logan');
Formuler les requêtes SQL correspondant aux questions suivantes afin de retrouver les informations dans la base de données « Cinémathèque ».
Ecrire la requête SQL correspondante.
SELECT titre FROM films;
Ecrire la requête SQL correspondante.
SELECT *
FROM films
WHERE annee>=1975 AND genre='Drame';
Ecrire la requête SQL correspondante.
-- produit cartesien (CROSS JOIN) et restriction (WHERE)
SELECT nom, prenom
FROM films f, roles r, personnes p
WHERE f.film_id=r.film_id
AND p.personne_id=r.acteur_id
AND titre='Taxi Driver';
-- jointure interne (INNER JOIN) et restriction (WHERE)
SELECT nom, prenom
FROM films INNER JOIN roles ON (films.film_id=roles.film_id),personnes
WHERE personne_id=acteur_id
AND titre='Taxi Driver';
-- jointure naturelle (NATURAL JOIN) et restriction (WHERE)
SELECT nom, prenom
FROM films NATURAL JOIN roles, personnes
WHERE personne_id=acteur_id AND titre='Taxi Driver';
Ecrire la requête SQL correspondante.
SELECT DISTINCT nom, prenom
FROM personnes, roles
WHERE personne_id=acteur_id
AND acteur_id IN (
SELECT realisateur_id
FROM films
);
Ecrire la requête SQL correspondante.
SELECT nom, role, titre
FROM personnes, roles NATURAL JOIN films
WHERE personne_id=acteur_id
AND realisateur_id IN (
SELECT personne_id
FROM personnes
WHERE nom='Scorsese' AND prenom='Martin'
)
ORDER BY nom;
Ecrire la requête SQL correspondante.
SELECT nom,prenom
FROM films, personnes
WHERE personne_id=realisateur_id
AND nom <> 'Leone'
AND genre IN (SELECT genre
FROM films, personnes
WHERE personne_id=realisateur_id
AND nom='Leone' AND prenom='Sergio');
Ecrire la requête SQL correspondante.
SELECT genre, COUNT (*)
FROM films
WHERE annee >= 1960
GROUP BY genre;
Ecrire la requête SQL correspondante.
-- produit cartesien (CROSS JOIN) et restriction (WHERE)
SELECT titre, COUNT(acteur_id)
FROM films f, roles r, personnes p
WHERE f.film_id=r.film_id
AND p.personne_id=f.realisateur_id
AND p.nom='Scorsese' AND p.prenom='Martin'
GROUP BY f.film_id, titre HAVING COUNT(*)>1;
-- jointure interne (INNER JOIN) et restriction (WHERE)
SELECT titre, COUNT(acteur_id)
FROM films INNER JOIN roles ON (films.film_id=roles.film_id),personnes
WHERE personne_id=realisateur_id
AND nom='Scorsese' AND prenom='Martin'
GROUP BY films.film_id, titre HAVING COUNT(*)>1;
-- jointure naturelle (NATURAL JOIN) et restriction (WHERE)
SELECT titre, COUNT(acteur_id)
FROM films NATURAL JOIN roles,personnes
WHERE personne_id=realisateur_id AND nom='Scorsese' AND prenom='Martin'
GROUP BY film_id, titre HAVING COUNT(*)>1;
Ecrire la requête SQL correspondante.
SELECT nom, prenom
FROM personnes,roles
WHERE personne_id=acteur_id
EXCEPT
SELECT nom, prenom
FROM films f, roles r, personnes p
WHERE f.film_id=r.film_id
AND p.personne_id=r.acteur_id
AND genre='Western';
Ecrire la requête SQL correspondante.
SELECT nom, prenom, count(distinct film_id) AS "Nombre de films"
FROM personnes, films
WHERE personne_id=realisateur_id AND nom<>'Leone' AND prenom<>'Sergio'
AND realisateur_id IN ( SELECT realisateur_id
FROM films
WHERE genre IN (SELECT genre
FROM personnes, films
WHERE personne_id=realisateur_id
AND nom='Leone' AND prenom='Sergio'))
GROUP BY nom, prenom;