Vous êtes sur la page 1sur 17

Bases de Donnes

TD : langage assertionnel SQL

Liste des requtes exprimer en SQL.


Tracer le graphe des cls trangres avant de commencer rpondre aux requtes.
Requtes lmentaires

Le but du TD est d'tudier les langages assertionnels pour le modle relationnel au


travers du langage standard SQL.

Requte!1!:

Retrouver la liste de tous les films.

Schma de la base de donnes CINMA

Requte!2!:

Retrouver la liste des films dont la longueur dpasse 180 min.

Requte!3!:

Donner la liste de tous les genres de film.

Requte!4!:

Trouver le titre et lanne des films de science fiction dont le budget


dpasse 5.000.000 $.

ACTEUR (NUMA, AGENT, SPCIALIT, TAILLE, POIDS)

Requte!5!:

Donner le nombre de films par genre.

CINMA (NUMC, NOM, ADRESSE, VILLE, TLPHONE,


COMPAGNIE)

Requte!6!:

Donner le nombre de films de 1960 par genre.

FILM (NUMF, TITRE, GENRE, ANNE, LONGUEUR, BUDGET,


RALISATEUR, SALAIRE_RAL)
DISTRIBUTION (NUMF, NUMA, RLE, SALAIRE)
PERSONNE (NUMP, PRNOM, NOM, DATENAIS, NATIONALIT,
ADRESSE, VILLE, TLPHONE)

PASSE NUMF, NUMC, NUMS, DATE_DEB, DATE_FIN,


HORAIRE, PRIX)

Requtes faciles

SALLE (NUMC, NUMS, TAILLE_CRAN, NBPLACES)


Les attributs NUMF, NUMP, NUMA, NUMC, NUMS sont des identifiants uniques
(cls primaires) pour respectivement : FILM, PERSONNE, ACTEUR, CINMA,
SALLE.
Un de ces attributs utilis comme attribut dune autre relation est une cl trangre
qui renvoie la cl primaire de la relation correspondante, par exemple dans
GNRIQUE, NUMF renvoie au NUMF de FILM et est dfini sur le mme
domaine.
De plus, les attributs RALISATEUR dans FILM et NUMA dans ACTEUR sont
dfinis sur le domaine des NUMP, et renvoient au NUMP de la personne
correspondante.

Requte!7!:

Trouver le titre des films raliss par Roman Polanski.

Requte!8!:

Quels sont les acteurs comiques (nom, prnom) qui ont jou dans un
film de Spielberg.

Requte!9!:

Trouver le titre et lanne du film le plus long.

Requtes de difficult moyenne


Requte!10!: Nom et prnom des acteurs qui ont jou Gavroche dans les
diffrentes versions des!!Misrables! avec les dates
correspondantes.

Requte!11!: Donner le nom et le prnom des ralisateurs qui ont jou dans au
moins un de leurs propres films.

Requte!21!: Trouver le nom, le prnom, le numro des acteurs qui ont jou dans
tous les films de Lelouch, s'il y en a.

Requte!12!: Quel est le total des salaires des acteurs du film !Nuits blanches
Seattle!.

Requte!22!: Pour chaque film de Bergman, trouver le nom et le prnom de


l'acteur qui a eu le plus gros salaire.

Requte!13!: Donner la moyenne des salaires des acteurs par film, avec le titre et
lanne correspondants.

Requte!23!: Donner le nom et le prnom des ralisateurs qui ont eu le plus gros
salaire sur un de leurs films (par comparaison avec ceux des
acteurs).

Requte!14!: Trouver le genre des films des annes 80 dont le budget moyen
dpasse 200.000 $.
Requtes plus complexes
Requte!15!: Pour chaque film de Spielberg (titre, anne), donner le total des
salaires des acteurs.

Schma complmentaire
RCOMPENSE (NUMR, CATGORIE, FESTIVAL)
RCOMPENSE_FILM (NUMF, ANNE, NUMR)
RCOMPENSE_ACTEUR (NUMA, NUMF, ANNE, NUMR)
Pour rpondre aux questions suivantes, il faut noter que lorsqu'un acteur reoit une
rcompense, le film en reoit une indirectement.
Ce schma complmentaire conduit utiliser une union dans les requtes.

Requte!16!: Lister les cinmas dont la taille moyenne d'cran est suprieure 40
mtres carrs.

Requte de difficult moyenne

Requte!17!: Quels sont les cinmas Parisiens de la Fox, avec le film


correspondant, qui passent un film d'Elia Kazan avant 22 heures
dans une salle d'au moins 200 places et d'cran de taille suprieure
30!m carrs.

Requte!24!: Donner le titre des films qui ont t prims au moins une fois (y
compris les rcompenses des acteurs jouant dans le film).

Requte!18!: Trouver le titre des films qui ne passent aucun cinma de la


compagnie FOX.

Requte!25!: Lister les cinmas qui ont exclusivement pass des films prims.

Requte!19!: Trouver le nom et le prnom des acteurs qui ont eu un salaire plus
important dans un film particulier que le salaire du ralisateur du
mme film.

Requtes difficiles

Requte!26!: Donner le titre des films qui ont reu au moins trois rcompenses.
Requte!27!: Noms et prnoms des acteurs qui ont reu plus de rcompenses
qu'aucun acteur qui a jou dans "Casablanca" n'en a eu.

Requtes difficiles
Requte!20!: Trouver les couples acteur-ralisateur (noms et prnoms) tels que
lun a dirig lautre sur un film et vice-versa sur un autre.
TD SQL (BD-Filmographie)

Bases de Donnes

TD : langage assertionnel SQL

Requte!3!: Donner la liste de tous les genres de film.


SELECT DISTINCT GENRE
FROM FILM
Requte!4!:

Trouver le titre et lanne des films de science fiction dont le budget


dpasse 5.000.000 $.
SELECT TITRE, ANNE
FROM FILM
WHERE GENRE = SciFi
AND
BUDGET > 5000000

Corrig
Liste des requtes exprimer en SQL.
Tracer le graphe des cls trangres avant de commencer rpondre aux requtes.

Graphe de la requte :

PERSONNE

GENRE = SciFi
BUDGET > 5000000

ACTEUR

CINMA

F
DISTRIBUTION
TITRE, ANNE

FILM

PASSE

SALLE

Res
Requtes lmentaires
Requte!1!: Retrouver la liste de tous les films.
SELECT *
FROM FILM
Requte!2!:
SELECT
FROM
WHERE

Retrouver la liste des films dont la longueur dpasse 180 min.


*
FILM
LONGUEUR > 180

Requte!5!:
SELECT
FROM
GROUP

Donner le nombre de films par genre.


GENRE, COUNT (*)
FILM
BY GENRE

Requte!6!:
SELECT
FROM
WHERE
GROUP

Donner le nombre de films de 1960 par genre.


GENRE, COUNT (*)
FILM
ANNE = 1960
BY GENRE

Requtes faciles
Requte!7!:

Graphe de la requte :

la requte imbrique ne contribue pas au rsultat

Trouver le titre des films raliss par Roman Polanski.


PRNOM = Roman
NOM = Polanski

Forme plate!:
SELECT F.TITRE
FROM FILM F, PERSONNE P
WHERE F.RALISATEUR = P.NUMP
AND
P.PRNOM = Roman
AND
P.NOM = Polanski

RALISATEUR = NUMP

P
E
TR
TI

Graphe de la requte :

Res
PRNOM = Roman
NOM = Polanski

RALISATEUR = NUMP

Requte!8!:

Quels sont les acteurs comiques (nom, prnom) qui ont jou dans un
film de Spielberg.

Graphe de la requte :

E
TR
TI

SPCIALIT =
Comique

Res
Forme imbrique!:
SELECT TITRE
FROM FILM
WHERE RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE PRNOM = Roman
AND
NOM = Polanski )

UM

N
P=

UM

NUMF = NUMF

RALISA
T

EUR = N

UMA

NOM =
Spielberg

PR

PA
PR
N

OM

,N

OM

Res
Forme plate :
SELECT PA.PRNOM, PA.NOM
FROM PERSONNE PA, DISTRIBUTION D, FILM F, PERSONNE PR
WHERE PA.NUMP = D.NUMA

Corrig du TD SQL (BD-Filmographie)

AND
AND
AND
AND

D.SPCIALIT = Comique
D.NUMF = F.NUMF
F.RALISATEUR = PR.NUMP
PR.NOM = Spielberg

Requte!9!:

Trouver le titre et lanne du film le plus long.

Forme imbrique!:
SELECT TITRE, ANNE
FROM FILM
WHERE LONGUEUR = (
SELECT MAX (LONGUEUR)
FROM FILM )

Forme imbrique!:
SELECT PRNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT NUMA
FROM DISTRIBUTION
WHERE SPCIALIT = Comique
AND
NUMF IN (
SELECT NUMF
FROM
FILM
WHERE RALISATEUR IN (
SELECT NUMP
FROMPERSONNE
WHERE NOM = Spielberg ) ) )

Requtes de difficult moyenne


Requte!10!: Nom et prnom des acteurs qui ont jou Gavroche dans les
diffrentes versions des!!Misrables! avec les dates
correspondantes.

Graphe de la requte : seule la variable PA contribue au rsultat, on obtient trois


niveaux dimbrication

Forme plate :
SELECT P.PRNOM, P.NOM, F.DATE
FROM PERSONNE P, DISTRIBUTION D, FILM F
WHERE P.NUMP = D.NUMA
AND
D.RLE = Gavroche
AND
G.NUMF = F.NUMF
AND
F.TITRE = Les misrables
Graphe de la requte :

SPCIALIT =
Comique

NU

=
MP

NU

RLE =
Gavroche
NUMF = NUMF

MA

RALISA
TE

NUMP = NUMA
UR = NU

PR
N
O

M,

NOM =
Spielberg

PR

PA

NUMF = NUMF

MA

P
PR
N

NO

Res

Corrig du TD SQL (BD-Filmographie)

TITRE =
Les misrables

OM
,N

DA

OM

TE

Res
3

Forme imbrique SQL-92!:


SELECT P.PRNOM, P.NOM, F.DATE
FROM PERSONNE P, FILM F
WHERE F.TITRE = Les misrables
AND
(P.NUMP, F.NUMF) IN (
SELECT NUMA, NUMF
FROM DISTRIBUTION
WHERE RLE = Gavroche )

Forme imbrique SQL-92!:


SELECT DISTINCT PRNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT RALISATEUR
FROM FILM
WHERE (RALISATEUR, NUMF) IN (
SELECT NUMA, NUMF
FROM
DISTRIBUTION ) )

Graphe de la requte : la requte imbrique ne contribue pas au rsultat et est


lie deux fois la requte englobante

Graphe de la requte :
RALISATEUR = NUMA

TITRE =
Les misrables

PR
N

OM

,N

OM

MP
NU

NUMF = NUMF
MA

NUM
F=N
UMF

NU

NUM

MP

P=

=
UR
TE
ISA
AL
R

NUM

NU

RLE =
Gavroche

E
AT
PRNOM, NOM

Res
Requte!11!: Donner le nom et le prnom des ralisateurs qui ont jou dans au
moins un de leurs propres films.
Forme plate :
SELECT DISTINCT P.PRNOM, P.NOM
FROM PERSONNE P, FILM F, DISTRIBUTION D
WHERE P.NUMP = F.RALISATEUR
AND
F.NUMF = D.NUMF
AND
D.NUMA = F.RALISATEUR

Res
Requte!12!: Quel est le total des salaires des acteurs du film !Nuits blanches
Seattle!.
Forme plate :
SELECT SUM (D.SALAIRE)
FROM DISTRIBUTION D, FILM F
WHERE DISTRIBUTION.NUMF = F.NUMF
AND
F.TITRE = Nuits blanches Seattle
Forme imbrique :
SELECT SUM (SALAIRE)

Corrig du TD SQL (BD-Filmographie)

FROM DISTRIBUTION
WHERE NUMF IN (
SELECT NUMF
FROM FILM
WHERE TITRE = Nuits blanches Seattle )
Graphe de la requte :
TITRE =
Nuits blanches Seattle

NUMF = NUMF

F
E
IR
LA
SA

SU

Res
Requte!13!: Donner la moyenne des salaires des acteurs par film, avec le titre et
lanne correspondants.
Forme SQL-89 :
SELECT F.TITRE, F.ANNE, AVG (D.SALAIRE)
FROM FILM F, DISTRIBUTION D
WHERE F.NUMF = D.NUMF
GROUP BY F.TITRE, F.ANNE
Forme SQL-92 :
SELECT F.TITRE, F.ANNE, AVG (D.SALAIRE)
FROM FILM F, DISTRIBUTION D
WHERE F.NUMF = D.NUMF
GROUP BY F.NUMF
-- Si NUMF a bien t dclar cl primaire de la relation FILM

Corrig du TD SQL (BD-Filmographie)

Requte!14!: Trouver le genre des films des annes 80 dont le budget moyen
dpasse 200.000 $.
SELECT GENRE
FROM FILM
WHERE ANNE BETWEEN 1980 AND 1989
GROUP BY GENRE
HAVING AVG (BUDGET) > 200000
Requtes plus complexes
Requte!15!: Pour chaque film de Spielberg (titre, anne), donner le total des
salaires des acteurs.
Forme plate :
SELECT F.TITRE, F.ANNE, SUM (D.SALAIRE)
FROM FILM F, DISTRIBUTION D, PERSONNE P
WHERE F.NUMF = D.NUMF
AND
F.RALISATEUR = P.NUMP
AND
P.NOM = Spielberg
GROUP BY F.TITRE, F.ANNE
Forme imbrique SQL-89 :
SELECT F.TITRE, F.ANNE, SUM (D.SALAIRE)
FROM FILM F, DISTRIBUTION D
WHERE F.NUMF = D.NUMF
AND
F.RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = Spielberg )
GROUP BY F.TITRE, F.ANNE
Forme imbrique SQL-92!:
SELECT F.TITRE, F.ANNE, X.SUMSAL
FROM FILM F, (
SELECT NUMF, SUM (SALAIRE) AS SUMSAL
FROM DISTRIBUTION

GROUP BY NUMF ) AS X
WHERE F.NUMF = X.NUMF
AND
F.RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = Spielberg )

AND
AND
AND
AND
AND
AND
AND
AND
AND
AND

Requte!16!: Lister les cinmas dont la taille moyenne d'cran est suprieure 40
mtres carrs.
Forme plate :
SELECT C.NOM, C.VILLE
FROM CINMA C, SALLE S
WHERE C.NUMC = S.NUMC
GROUP BY C.NUMC, C.NOM, C.VILLE
HAVING AVG (S.TAILLE_CRAN) > 40 )
Forme imbrique SQL-92!:
SELECT NOM, VILLE
FROM CINMA
WHERE NUMC IN (
SELECT NUMC
FROM SALLE
GROUP BY NUMC
HAVING AVG (TAILLE_CRAN) > 40 )
Requte!17!: Quels sont les cinmas Parisiens de la Fox, avec le film
correspondant, qui passent un film d'Elia Kazan avant 22 heures
dans une salle d'au moins 200 places et d'cran de taille suprieure
30!m carrs.
Forme plate :
SELECT DISTINCT C.NOM, F.TITRE
FROM CINMA C, SALLE S, PASSE P, FILM F, PERSONNE P
WHERE C.COMPAGNIE = Fox
AND
C.VILLE = Paris
Corrig du TD SQL (BD-Filmographie)

C.NUMC = S.NUMC
S.NBPLACES >= 200
S.TAILLE_CRAN > 30
S.NUMC = P.NUMC
S.NUMS = P.NUMS
P.HORAIRE < 22!:00
P.NUMF = F.NUMF
F.RALISATEUR = P.NUMP
P.PRNOM = Elia
P.NOM = Kazan

Graphe de la requte :
TAILLE_CRAN > 30
NBPLACES >= 200

=
MC
NU

HORAIRE <
22:00

NUMC = NUMC

MC
NU

RALISA
TE

NUMF = NUMF

UR = NU
MA

NUMS = NUMS

NO

NOM =
Spielberg

PR
E
TR
TI

Res

Forme imbrique SQL-89 :


SELECT DISTINCT C.NOM, F.TITRE
FROM CINMA C, SALLE S, PASSE P, FILM F
WHERE C.COMPAGNIE = Fox
AND
C.VILLE = Paris
AND
C.NUMC = S.NUMC
AND
S.NBPLACES >= 200
AND
S.TAILLE_CRAN > 30
AND
S.NUMC = P.NUMC
AND
S.NUMS = P.NUMS
AND
P.HORAIRE < 22!:00
AND
P.NUMF = F.NUMF
6

AND

F.RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE PRNOM = Elia
AND
NOM = Kazan )

TI
TR
E

Corrig du TD SQL (BD-Filmographie)

F,

Forme plate : pour trouver ceux qui passent dans un cinma de la Fox
SELECT DISTINCT F.NUMF, F.TITRE
FROM FILM F, PASSE P, CINMA C
WHERE F.NUMF = P.NUMF
AND
P.NUMC = C.NUMC
AND
C.COMPAGNIE = Fox

On commence par poser la requte inverse!: les films qui passent dans un (au
moins) cinma de la Fox.

COMPAGNIE =
Fox

NUMC = NUMC

Requte!18!: Trouver le titre des films qui ne passent aucun cinma de la


compagnie FOX.

NUMF = NUMF

Forme imbrique SQL-92!:


SELECT DISTINCT C.NOM, F.TITRE
FROM CINMA C, FILM F
WHERE C.COMPAGNIE = Fox
AND
C.VILLE = Paris
AND
(C.NUMC, F.NUMF) IN (
SELECT S.NUMC, P.NUMF
FROM SALLE S, PASSE P
WHERE S.NBPLACES >= 200
AND
S.TAILLE_CRAN > 30
AND
S.NUMC = P.NUMC
AND
S.NUMS = P.NUMS
AND
P.HORAIRE < 22!:00 )
AND
F.RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE PRNOM = Elia
AND
NOM = Kazan )

Graphe de la requte :

Res
Forme imbrique 1 prdicat IN : pour trouver ceux qui passent dans un cinma
de la Fox
SELECT DISTINCT NUMF, TITRE
FROM FILM
WHERE NUMF IN (
SELECT NUMF
FROM PASSE
WHERE NUMC IN (
SELECT NUMC
FROM
CINMA
WHERE COMPAGNIE = Fox ) )
Forme imbrique 2 prdicat EXISTS : toujours pour trouver ceux qui passent
dans un cinma de la Fox
SELECT DISTINCT NUMF, TITRE
FROM FILM F
WHERE EXISTS (
SELECT *
FROM PASSE P
WHERE P.NUMF = F.NUMF
AND
EXISTS (
7

SELECT
FROM
WHERE
AND

*
CINMA C
C.NUMC = P.NUMC
COMPAGNIE = Fox ) )

La ngation de ces deux dernires formes permet dexprimer la requte initiale!: les
films qui ne passent aucun des cinmas de la Fox.
Forme imbrique 1 prdicat NOT IN :

pour trouver ceux qui ne passent dans


aucun cinma de la Fox

SELECT DISTINCT NUMF, TITRE


FROM FILM
WHERE NUMF NOT IN (
SELECT NUMF
FROM PASSE
WHERE NUMC IN (
SELECT NUMC
FROM
CINMA
WHERE COMPAGNIE = Fox ) )
Forme imbrique 2 prdicat NOT EXISTS : pour trouver ceux qui ne passent
dans aucun cinma de la Fox
SELECT DISTINCT NUMF, TITRE
FROM FILM F
WHERE NOT EXISTS (
SELECT *
FROM PASSE P
WHERE P.NUMF = F.NUMF
AND
EXISTS (
SELECT *
FROM
CINMA C
WHERE C.NUMC = P.NUMC
AND
COMPAGNIE = Fox ) )
Pour finalement arriver la forme la plus simple, o seul le prdicat NOT EXISTS
provoque un niveau dimbrication.

Corrig du TD SQL (BD-Filmographie)

Forme 3 prdicat NOT EXISTS uniquement :


SELECT DISTINCT NUMF, TITRE
FROM FILM F
WHERE NOT EXISTS (
SELECT *
FROM PASSE P, CINMA C
WHERE F.NUMF = P.NUMF
AND
P.NUMC = C.NUMC
AND
COMPAGNIE = Fox )
Si on est trs pointilleux, on peut remarquer que la question !qui ne passent
aucun! peut tre comprise comme ne devant retourner que les films actuellement
programms, mais pas dans un cinma de la Fox. Si la relation FILM comporte
tous les films qui ont t programms, on peut modifier la requte comme suit!:
Forme complte :
SELECT DISTINCT NUMF, TITRE
FROM FILM F
WHERE NUMF IN (
SELECT NUMF
FROM PASSE )
AND
NOT EXISTS (
SELECT *
FROM PASSE P, CINMA C
WHERE F.NUMF = P.NUMF
AND
P.NUMC = C.NUMC
AND
COMPAGNIE = Fox )
Requte!19!: Trouver le nom et le prnom des acteurs qui ont eu un salaire plus
important dans un film particulier que le salaire du ralisateur du
mme film.
En supposant pour simplifier que les acteurs nont jou quun seul rle dans le film.
Forme plate :
SELECT PA.PRNOM, PA.NOM
FROM PERSONNE PA, DISTRIBUTION D, FILM F
WHERE PA.NUMP = D.NUMA
8

AND
AND

D.NUMF = F.NUMF
D.SALAIRE > F.SALAIRE_RAL

WHERE D.NUMF = F.NUMF ) )


En tenant compte de la possibilit que les acteurs aient jou plusieurs rles dans le
film, et en supposant quils touchent un salaire pour chaque rle dans ce cas. (NB!:
cela ne reflte pas forcment les pratiques de lindustrie du cinma, mais pour
faire plus proche de la ralit, il faudrait compliquer sensiblement le schma de la
base).

Graphe de la requte :
SALAIRE_RAL < SALAIRE

NU

MP

NU

MA

NUMF = NUMF

PRNOM, NOM

Res
Forme imbrique 1 :
SELECT PRNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT D.NUMA
FROM DISTRIBUTION D, FILM F
WHERE D.NUMF = F.NUMF
AND
D.SALAIRE > F.SALAIRE_RAL )
Forme imbrique 2!:
SELECT PRNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT NUMA
FROM DISTRIBUTION D
WHERE D.SALAIRE > (
SELECT F.SALAIRE_RAL
FROM
FILM F
Corrig du TD SQL (BD-Filmographie)

Forme imbrique SQL-89 :


SELECT DISTINCT PA.PRNOM, PA.NOM
FROM PERSONNE PA, DISTRIBUTION D
WHERE PA.NUMP = D.NUMA
GROUP BY D.NUMA, D.NUMF, PA.PRNOM, PA.NOM
HAVING SUM (SALAIRE) > (
SELECT SALAIRE_RAL
FROM FILM F
WHERE D.NUMF = F.NUMF ) )
Forme imbrique SQL-92 :
SELECT PRNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT NUMA
FROM DISTRIBUTION D
GROUP BY NUMA, NUMF
HAVING SUM (SALAIRE) > (
SELECT SALAIRE_RAL
FROM
FILM F
WHERE D.NUMF = F.NUMF ) )
Requtes difficiles
Requte!20!: Trouver les couples acteur-ralisateur (noms et prnoms) tels que
lun a dirig lautre sur un film et vice-versa sur un autre.
Forme plate :
SELECT DISTINCT P1.PRNOM, P1.NOM, P2.PRNOM, P2.NOM
FROM PERSONNE P1, PERSONNE P2, FILM F1, FILM F2,
9

DISTRIBUTION D1, DISTRIBUTION D2


WHERE P1.NUMP > P2.NUMP
-PERMET DLIMINER DEUX PROBLMES!:
-LISTER UN COUPLE (P1, P2) UNE SEULE FOIS
-DANS UN SEUL ORDRE
-LIMINER LE CAS DES RALISATEURS QUI ONT JOU
-DANS LEUR PROPRE FILM
AND
P1.NUMP = F1.RALISATEUR
AND
P2.NUMP = F2.RALISATEUR
AND
F1.NUMF = D1.NUMF
AND
D1.NUMA = F2.RALISATEUR
AND
F2.NUMF = D2.NUMF
AND
D2.NUMA = F1.RALISATEUR

---AND
AND
AND
AND

Requte!21!: Trouver le nom, le prnom, le numro des acteurs qui ont jou dans
tous les films de Lelouch, s'il y en a.
On peut rephraser logiquement cette requte en remarquant que lon cherche les
acteurs des films de Lelouch pour lesquels pour chaque film de Lelouch on peut
trouver un tuple dans distribution qui indique que lacteur a bien jou dans ce film.
{acteur!: " film-de-Lelouch, $ distribution tq acteur-a-jou-dans-film }

Graphe de la requte :
NUMF = NUMF

D1

RA
LISA
TEU
R

F1
NUMA
=

RALIS

ISAT

= NU

MA

NUM

AL
= R

P1

P1

ATEUR

RALIS

MP

NUM
PRNOM,
NOM

EUR

NUMF = NUMF

F1

NUMP > NUMP

NUMA = NU

DANS UN SEUL ORDRE


LIMINER LE CAS DES RALISATEURS QUI ONT JOU
DANS LEUR PROPRE FILM
F1.NUMF = D1.NUMF
D1.NUMA = F2.RALISATEUR
F2.NUMF = D2.NUMF
D2.NUMA = F1.RALISATEUR )

ATEUR

D1
A

= NUM

P = NUMA

PRNOM,
NOM

Res
Forme imbrique SQL-92!:
SELECT DISTINCT P1.PRNOM, P1.NOM, P2.PRNOM, P2.NOM
FROM PERSONNE P1, PERSONNE P2
WHERE (P1.NUMP, P2.NUMP) IN (
SELECT F1.RALISATEUR, F2.RALISATEUR
FROM FILM F1, FILM F2, DISTRIBUTION D1,
DISTRIBUTION D2
WHERE F1.RALISATEUR > F2.RALISATEUR
-- PERMET DLIMINER DEUX PROBLMES!:
-LISTER UN COUPLE (RAL1, RAL2) UNE SEULE FOIS
Corrig du TD SQL (BD-Filmographie)

SQL ne comporte pas dquivalent du quantificateur universel ". On doit donc


utiliser une transformation logique introduction dune double ngation qui
produit la ngation dun quantificateur existentiel $ aprs descente dune des
deux ngations.
{acteur!: $ film-de-Lelouch, $ distribution tq acteur-a-jou-dans-film }
Le plus simple est de dabord crire la requte sans ngation en utilisant une forme
imbrique avec des prdicats EXIXTS, puis dintroduire une double ngation. On
commencera donc par chercher le nom, le prnom, le numro des acteurs qui ont
jou dans un des films de Lelouch.
Forme imbrique prdicat EXISTS : !dans un des films!
SELECT NOM, PRNOM
FROM PERSONNE P
WHERE EXISTS (
SELECT *
FROM FILM F
WHERE RALISATEUR IN (
SELECT NUMP
FROM
PERSONNE
WHERE NOM = Lelouch )
AND
EXISTS (
10

SELECT
FROM
WHERE
AND

*
DISTRIBUTION D
D.NUMF = F.NUMF
D.NUMA = P.NUMP ) )

Il ne reste plus alors qu introduire les deux ngations pour obtenir la requte
souhaite.
Forme imbrique prdicat NOT EXISTS : !dans tous les films!
SELECT NOM, PRNOM, NUMP
FROM PERSONNE P
WHERE NOT EXISTS (
SELECT *
FROM FILM F
WHERE RALISATEUR IN (
SELECT NUMP
FROM
PERSONNE
WHERE NOM = Lelouch )
AND
NOT EXISTS (
SELECT *
FROM
DISTRIBUTION D
WHERE D.NUMF = F.NUMF
AND
D.NUMA = P.NUMP ) )
Requte!22!: Pour chaque film de Bergman, trouver le nom et le prnom de
l'acteur qui a eu le plus gros salaire.
Il faut galement rephraser cette requte pour lexprimer de faon logique. La
requte consiste chercher les acteurs pour lesquels, quels que soient les autres
acteurs du mme film, leur salaire est plus lev.
Pour simplifier on va dabord se limiter au cas o un acteur ne joue quun rle par
film.
{ film,! acteur!: film film-de-Bergman, acteur acteur-ayant-jou-dans-cefilm, " autre-acteur-ayant-jou-dans-ce-film $ distribution tq acteur-a-joudans-film-avec-plus-gros-salaire-que-autre-acteur }
Soit aprs introduction dune double ngation pour liminer le!" :

Corrig du TD SQL (BD-Filmographie)

{ film,! acteur!: film film-de-Bergman, acteur acteur-ayant-jou-dans-cefilm, $ autre-acteur-ayant-jou-dans-ce-film $ distribution tq acteur-a-joudans-film-avec-plus-gros-salaire-que-autre-acteur }


Forme imbrique prdicat NOT EXISTS : un seul rle par acteur
SELECT F.TITRE, PA.PRNOM, PA.NOM
FROM FILM F, DISTRIBUTION D1, PERSONNE PA
WHERE F.NUMF = D1.NUMF
AND
D1.NUMA = PA.NUMP
AND
RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = Bergman )
AND
NOT EXISTS (
SELECT *
FROM DISTRIBUTION D2
WHERE D2.NUMF = D1.NUMF
AND
D2.SALAIRE > D1.SALAIRE )
En tenant compte maintenant de la possibilit pour un acteur de jouer plusieurs
rles dans un film, on obtient la requte suivante.
Forme imbrique SQL-89+ prdicat > ALL : possibilit de plusieurs rles pour
un mme acteur
SELECT F.TITRE, PA.PRNOM, PA.NOM
FROM FILM F, DISTRIBUTION D1, PERSONNE PA
WHERE F.NUMF = D1.NUMF
AND
D1.NUMA = PA.NUMP
AND
RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = Bergman )
GROUP BY D1.NUMF, D1.NUMA, F.TITRE, PA.PRNOM, PA.NOM
HAVING SUM (SALAIRE) > ALL (
SELECT SUM (SALAIRE)
FROM DISTRIBUTION D2
WHERE D2.NUMF = D1.NUMF
11

AND
D2.NUMA <> D1.NUMA
GROUP BY D2.NUMA )
Forme imbrique SQL-92 : possibilit de plusieurs rles pour un mme acteur
SELECT F.TITRE, PA.PRNOM, PA.NOM
FROM FILM F, PERSONNE PA
WHERE (F.NUMF, PA.NUMP) IN (
SELECT D1.NUMF, D1.NUMA
FROM DISTRIBUTION D1
WHERE D1.NUMF IN (
SELECT NUMF
FROM
FILM
WHERE RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = Bergman ) )
GROUP BY D1.NUMF, D1.NUMA
HAVING SUM (D1.SALAIRE) = (
SELECT MAX (
SELECT SUM (D2.SALAIRE)
FROM DISTRIBUTION D2
WHERE D2.NUMF = D1.NUMF
GROUP BY D2.NUMA ) )
On peut aussi simplifier en repartant de la requte valable seulement si un acteur ne
joue quun rle par film et en utilisant une vue groupe la place de distribution.
Utilisation dune vue groupe SQL-92!:
CREATE VIEW SALAIRE_TOTAL_ACTEUR_FILM
(NUMA, NUMF, SALAIRE_TOTAL)
AS SELECT NUMA, NUMF, SUM (SALAIRE)
FROM FILM
GROUP BY NUMA, NUMF
SELECT F.TITRE, PA.PRNOM, PA.NOM
FROM FILM F, SALAIRE_TOTAL_ACTEUR_FILM D1, PERSONNE PA
Corrig du TD SQL (BD-Filmographie)

WHERE F.NUMF = D1.NUMF


AND
D1.NUMA = PA.NUMP
AND
RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE NOM = Bergman )
AND
NOT EXISTS (
SELECT *
FROM SALAIRE_TOTAL_ACTEUR_FILM D2
WHERE D2.NUMF = D1.NUMF
AND
D2.SALAIRE_TOTAL > D1.SALAIRE_TOTAL )
Requte!23!: Donner le nom et le prnom des ralisateurs qui ont eu le plus gros
salaire sur un de leurs films (par comparaison avec ceux des
acteurs).
Hypothse 1!: chaque acteur ne joue quun rle, le ralisateur ne joue pas dans le
film correspondant.
Forme imbrique :
SELECT PRNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT RALISATEUR
FROM FILM F
WHERE SALAIRE_RAL > (
SELECT MAX (SALAIRE)
FROM
DISTRIBUTION D
WHERE D.NUMF = F.NUMF ) )
Hypothse 2!: un acteur peut jouer plusieurs rles, le ralisateur ne joue pas dans le
film correspondant.
Forme imbrique :
SELECT PRNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT RALISATEUR
12

FROM FILM F
WHERE SALAIRE_RAL > ALL (
SELECT SUM (SALAIRE)
FROM
DISTRIBUTION D
WHERE D.NUMF = F.NUMF
GROUP BY NUMA ) )
Hypothse 3!: Tout acteur y compris le ralisateur sil joue dans le film
correspondant peut jouer plusieurs rles.
Forme imbrique SQL-92 :
SELECT PRNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT RALISATEUR
FROM FILM F
WHERE SALAIRE_RAL
+(
SELECT SUM (SALAIRE)
FROM
DISTRIBUTION D1
WHERE D1.NUMF = F.NUMF
AND
D1.NUMA = F.RALISATEUR )
>(
SELECT MAX (
SELECT SUM (SALAIRE)
FROM
DISTRIBUTION D2
WHERE D2.NUMF = F.NUMF
GROUP BY D2.NUMA ) ) )

Schma complmentaire
RCOMPENSE (NUMR, CATGORIE, FESTIVAL)
RCOMPENSE_FILM (NUMF, ANNE, NUMR)
RCOMPENSE_ACTEUR (NUMA, NUMF, ANNE, NUMR)
Pour rpondre aux questions suivantes, il faut noter que lorsqu'un acteur reoit une
rcompense, le film en reoit une indirectement. Ce schma complmentaire
conduit utiliser une union dans les requtes.
Corrig du TD SQL (BD-Filmographie)

Requte de difficult moyenne


Requte!24!: Donner le titre des films qui ont t prims au moins une fois (y
compris les rcompenses des acteurs jouant dans le film).
Forme plate SQL-89 :
SELECT DISTINCT F.TITRE, F.ANNE
FROM FILM F, RCOMPENSE_FILM RF
WHERE F.NUMF = RF.NUMF
UNION
SELECT DISTINCT F.TITRE, F.ANNE
FROM FILM F, RCOMPENSE_ACTEUR RA
WHERE F.NUMF = RA.NUMF
Forme imbrique SQL-92 :
SELECT TITRE, ANNE
FROM FILM
WHERE NUMF IN (
SELECT NUMF
FROM RCOMPENSE_FILM
UNION
SELECT NUMF
FROM RCOMPENSE_ACTEUR )
Requtes difficiles
Requte!25!: Lister les cinmas qui ont exclusivement pass des films prims.
Il faut rephraser cette requte pour lexprimer de faon logique. La requte consiste
chercher les cinmas pour lesquels, quels que soient les films programms, ces
films ont obtenu au moins une rcompense. Comme on ne peut pas utiliser dunion
dans une sous-requte, il faut donc utiliser une disjonction (ou).
{ cinma!: " film-programm-dans-ce-cinma ( ($ rcompense-film tq film-at-rcompens) ($ rcompense-acteur tq film-a-t-rcompens) ) }
Soit, aprs introduction dune double ngation pour liminer le!", la disjonction se
transforme en conjonction (et) :

13

{ cinma!: $ film-programm-dans-ce-cinma ( ($ rcompense-film tq filma-t-rcompens) ($ rcompense-acteur tq film-a-t-rcompens) ) }


Forme imbrique SQL-89 :
SELECT NOM, VILLE
FROM CINMA C
WHERE NOT EXISTS (
SELECT *
FROM PASSE P
WHERE P.NUMC = C.NUMC
AND
NOT EXISTS (
SELECT *
FROM
RCOMPENSE_FILM RF
WHERE RF.NUMF = P.NUMF )
AND
NOT EXISTS (
SELECT *
FROM
RCOMPENSE_ACTEUR RA
WHERE RA.NUMF = P.NUMF ) )
En SQL-2 par contre, on peut utiliser une union dans une sous-requte, ce qui
simplifie son expression.
Forme imbrique SQL-92 prdicat NOT EXISTS :
SELECT NOM, VILLE
FROM CINMA C
WHERE NOT EXISTS (
SELECT *
FROM PASSE P
WHERE P.NUMC = C.NUMC
AND
NOT EXISTS (
SELECT *
FROM
(
SELECT NUMF
FROM RCOMPENSE_FILM
UNION
SELECT NUMF
FROM RCOMPENSE_ACTEUR ) AS R
Corrig du TD SQL (BD-Filmographie)

WHERE R.NUMF = P.NUMF ) )


Forme imbrique SQL-92 prdicat NOT IN :
SELECT NOM, VILLE
FROM CINMA
WHERE NUMC NOT IN (
SELECT NUMC
FROM PASSE
WHERE NUMF NOT IN (
SELECT R.NUMF
FROM
(
SELECT NUMF
FROM RCOMPENSE_FILM
UNION
SELECT NUMF
FROM RCOMPENSE_ACTEUR ) AS R ) ) )
Requte!26!: Donner le titre des films qui ont reu au moins trois rcompenses.
Forme imbrique SQL-92 :
SELECT TITRE, ANNE
FROM FILM
WHERE NUMF IN (
SELECT R.NUMF
FROM (
SELECT NUMF
FROM RCOMPENSE_FILM
UNION
SELECT NUMF
FROM RCOMPENSE_ACTEUR ) AS R
GROUP BY R.NUMF
HAVING COUNT (*) >= 3 )

14

Requte!27!: Noms et prnoms des acteurs qui ont reu plus de rcompenses
qu'aucun acteur qui a jou dans "Casablanca" n'en a eu.
Forme imbrique SQL-92 :
SELECT PRNOM, NOM
FROM PERSONNE
WHERE NUMP IN (
SELECT NUMA
FROM RCOMPENSE_ACTEUR
GROUP BY NUMA
HAVING COUNT (*) > (
SELECT MAX (
SELECT COUNT (*)
FROM RCOMPENSE_ACTEUR
WHERE NUMA IN (
SELECT NUMA
FROM DISTRIBUTION
WHERE NUMF IN (
SELECT NUMF
FROM FILM
WHERE TITRE = Casablanca ) )
GROUP BY NUMA ) ) )

Corrig du TD SQL (BD-Filmographie)

15

Vous aimerez peut-être aussi