Vous êtes sur la page 1sur 9

Soit une base de données de films et d'informations sur ces films (acteurs, réalisateurs,

...). Cette base est inspirée de ce site. Le schéma relationnel de cette base est décrit ci-
dessous :

• films (id, titre, annee, score, nbvotant, idrealisateur)


• acteurs (id, nom)
• distributions (idfilm, idacteur, rang)
• realisateurs(id, nom)

Un film est décrit de manière unique par un identifiant (entier, clé de la relation), un titre,
une année (première sortie du film), un score (moyenne de tous les votes pour ce film),
un nombre de votants et un réalisateur (entier, clé étrangère sur realisateurs).

Un acteur est décrit de manière unique par un identifiant (entier, clé de la relation) et un
nom.

Un acteur peut jouer un role dans zéro ou plusieurs films et un film a zéro ou plusieurs
acteurs dans sa distribution. L'attribut rang indique le statut de l'acteur dans le film
(rang=1 indique que l'acteur est la vedette du film). Le couple (idacteur, idfilm) est la clé
de la relation distributions. idacteur est une clé étrangère sur acteurs et idfilm est une clé
étrangère sur films.

Un réalisateur est identifié de manière unique par son identifiant (entier, clé de la
relation) et un nom.
 

1.1 Donner la liste des films (id, titre et annee) triée par titre.

Select id, titre, annee

From FILMS

Order by titre

1.2 Donner la liste des films avec un score supérieur ou égal à 9 ?

Select *

From FILMS

Where score >=9

1.3 Quels sont les acteurs principaux (rang=1) des films sortis en 2000 ? On veut l'id et le
nom triés par nom.

Select a.id, a.nom

From FILMS f , DISTRIBUTIONS d, ACTEURS a

Where f.id=d.idFilm and a.id=d.idActeur and d.rang=1 and f.annee=2000

Order by a.nom

ou bien

Select a.id, a.nom

From FILMS f JOIN DISTRIBUTIONS d ON (f.id=d.idFilm) JOIN ACTEURS a


ON (a.id=d.idActeur)

Where d.rang=1 and f.annee=2000

Order by a.nom
1.5 Donner les id des films sortis avant 1930 ou bien dans lesquels joue l'acteur de id 12.

Select id
From FILMS
Where annee < 1930
Union
Select idFilm
From DISTRIBUTIONS
Where idActeur =12

1.6 Donner le nom des vedettes (rang=1) du film ayant l'id 11, dans l'ordre alphabétique.

Select nom

From ACTEURS, DISTRIBUTIONS

Where id=idActeur and idFilm=11 and rang=1

Order by nom

1 tuple

Autres solutions :

Select nom

From ACTEURS JOIN DISTRIBUTIONS ON (id=idActeur)

Where idFilm=11 and rang=1

Order by nom

Select nom

From ACTEURS

Where id in ( Select idActeur

From DISTRIBUTIONS

Where idFilm=11 and rang=1 )

Order By nom

Select A.nom
From ACTEURS A

Where exists ( Select D.*

From DISTRIBUTIONS D

Where A.id= D.idActeur and

D.idFilm = 11 and D.rang = 1 )

Order By A.nom

1.7 Donner les noms des réalisateurs de films sortis avant 1970 et ayant 'the' dans leur
titre.

Select distinct R.nom

From REALISATEURS R, FILMS f

Where R.id=f.idrealisateur and f.annee < 1970 and f.titre like '%the%'

Oracle, différencie les majuscules/minuscules du contenu de la BD

Erreurs classiques :
- le distinct est utilisé ici car un réalisateur peut avoir réalisé deux films différents
remplissant les conditions.

ou bien

Select distinct R.nom

From REALISATEURS R JOIN FILMS f ON (R.id=f.idrealisateur)

Where f.annee < 1970 and f.titre like '%the%'

1.8 Donner les id et titre des films n'ayant aucun acteur dans leur distribution.

Attention : Except pour SQL

Select id, titre

From FILMS
MINUS

Select id, titre

From FILMS, DISTRIBUTIONS

Where id=idFilm

or

Select id, titre

From FILMS

Where id in (Select id From FILMS

MINUS

Select idFilm From DISTRIBUTIONS)

Select id, titre


FROM FILMS where id not in (
Select id
From FILMS, DISTRIBUTIONS
Where id=idFilm)

1.9 Donner les films (id et titre) sortis en 2000 et ayant au moins deux acteurs dans leur
distribution.

Select distinct f.id, f.titre

From FILMS f, DISTRIBUTIONS d1, DISTRIBUTIONS d2

Where f.id=d1.idFilm AND f.id=d2.idFilm AND d1.idActeur<>d2.idActeur


AND f.annee=2000

ou bien

Select distinct f.id, f.titre

From FILMS f JOIN DISTRIBUTIONS d1 ON (f.id=d1.idFilm) JOIN


DISTRIBUTIONS d2 ON (f.id=d2.idFilm)
Where d1.idActeur<>d2.idActeur AND f.annee=2000

1.10 Donner le(s) film(s) (id, titre) avec le score le plus haut.

Select id, titre

From FILMS

Minus

Select f1.id, f1.titre

From FILMS f1, FILMS f2

Where f1.score < f2.score

ou bien

Select id, titre

From FILMS

Minus

Select f1.id, f1.titre

From FILMS f1 JOIN FILMS f2 ON (f1.score < f2.score)

Solution qui n'implémente pas MINUS :

Select id, titre


From FILMS
where id not in (
Select f1.id
From FILMS f1, FILMS f2
Where f1.score < f2.score)

2.1 Donner le nombre total de films dirigés par le réalisateur d'id 11.

Select count(*)

From FILMS

Where idrealisateur = 11
2.2 Donner la liste des noms de réalisateurs, dans l'ordre alphabétique. Pour chaque
réalisateur, donner son nom et le nombre de films réalisés.

Select r.id, r.nom, count(*)

From FILMS f, REALISATEURS r

Where f.idrealisateur=r.id

Group By r.id, r.nom

Order By r.nom

ou bien

Select r.id, r.nom, count(*)

From FILMS f JOIN REALISATEURS r ON (f.idrealisateur=r.id)

Group By r.id, r.nom

Order By r.nom

2.3 Pour chaque film, donner son id, son titre et son nombre total d'acteurs.

Select f.id, f.titre, count(*)

From FILMS f, DISTRIBUTIONS d

Where f.id=d.idFilm

Group By f.id, f.titre

ou bien

Select f.id, f.titre, count(*)

From FILMS f JOIN DISTRIBUTIONS d ON (f.id=d.idFilm)

Group By f.id, f.titre


2.4 Quels sont les acteurs jouant dans au moins trois films avec des rangs différents.
Donner leur id et leur nom.

Select a.id, a.nom

From ACTEURS a, DISTRIBUTIONS d

Where a.id=d.idActeur

Group By a.id, a.nom

Having count(distinct rang) >=3

Erreurs classiques :

a) oubli de la clause Distinct => un rang est compté plusieurs fois

b) oublier a.id dans le Group By => des acteurs avec le même nom vont se trouver dans
le même groupe alors qu'ils ont un id différent (nom n'est pas clé pour ACTEURS).

ou bien

Select a.id, a.nom

From ACTEURS a JOIN DISTRIBUTIONS d ON (a.id=d.idActeur)

Group By a.id, a.nom

Having count(distinct rang) >=3

2.5 Quels sont les réalisateurs (id et nom) qui ont dirigé le plus grand nombre de films ?

Sous Oracle uniquement (max(count(*)) ne fonctionne pas sous MySQL et sous postgreSQL)
Select r.id, r.nom
From REALISATEURS r, FILMS f
Where f.idrealisateur=r.id
Group By r.id, r.nom
Having count(*) = (Select max(count(*)) From FILMS Group By
idrealisateur)

ou autre solution valable sous MySQL et postgreSQL


Select r.id, r.nom
From REALISATEURS r, FILMS f
Where f.idrealisateur=r.id
Group By r.id, r.nom
Having count(*) >= ALL (Select count(*) From FILMS Group By
idrealisateur)

Vous aimerez peut-être aussi