Académique Documents
Professionnel Documents
Culture Documents
Requte!1!:
Requte!2!:
Requte!3!:
Requte!4!:
Requte!5!:
Requte!6!:
Requtes faciles
Requte!7!:
Requte!8!:
Quels sont les acteurs comiques (nom, prnom) qui ont jou dans un
film de Spielberg.
Requte!9!:
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!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!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!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
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
Requte!5!:
SELECT
FROM
GROUP
Requte!6!:
SELECT
FROM
WHERE
GROUP
Requtes faciles
Requte!7!:
Graphe de la requte :
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
AND
AND
AND
AND
D.SPCIALIT = Comique
D.NUMF = F.NUMF
F.RALISATEUR = PR.NUMP
PR.NOM = Spielberg
Requte!9!:
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 ) ) )
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
TITRE =
Les misrables
OM
,N
DA
OM
TE
Res
3
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)
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
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
AND
F.RALISATEUR IN (
SELECT NUMP
FROM PERSONNE
WHERE PRNOM = Elia
AND
NOM = Kazan )
TI
TR
E
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
NUMF = NUMF
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 :
AND
AND
D.NUMF = F.NUMF
D.SALAIRE > F.SALAIRE_RAL
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)
---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
NUMA = NU
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)
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!" :
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)
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)
13
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 ) ) )
15