Vous êtes sur la page 1sur 15

Bases de Donnes

TD : langage assertionnel SQL Corrig


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

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

Graphe de la requte :
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 Requte 6 : SELECT FROM WHERE GROUP Donner le nombre de films par genre. GENRE, COUNT (*) FILM BY GENRE Donner le nombre de films de 1960 par genre. GENRE, COUNT (*) FILM ANNE = 1960 BY GENRE

Requtes faciles Requte 7 : Trouver le titre des films raliss par Roman Polanski.

Graphe de la requte :

la requte imbrique ne contribue pas au rsultat

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

PRNOM = Roman NOM = Polanski RALISATEUR = NUMP

F
E TR TI

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

F
E TR TI

Graphe de la requte :
SPCIALIT = Comique

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

UM

NUMF = NUMF

RALISA T

EUR = N

UMA

NOM = Spielberg

PA
PR N OM ,N OM

PR

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 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 ) ) ) Graphe de la requte : seule la variable PA contribue au rsultat, on obtient trois niveaux dimbrication

Forme imbrique : SELECT TITRE, ANNE FROM FILM WHERE LONGUEUR = ( SELECT MAX (LONGUEUR) FROM FILM ) 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. 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

RLE = Gavroche
NUMF = NUMF

NU

= MP

NU

MA

RALISA TE

NUMP = NUMA
UR = NU MA
NOM = Spielberg

NUMF = NUMF

D P
PR N OM ,N OM
DA TE

TITRE = Les misrables

PA
PR N O M, NO M

PR

Res

Res
3

Corrig du TD SQL (BD-Filmographie)

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 ) Graphe de la requte : la requte imbrique ne contribue pas au rsultat et est lie deux fois la requte englobante

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 :
RALISATEUR = NUMA

RLE = Gavroche
NUM P= NUM A

F
= UR TE ISA AL R

D
NUMF = NUMF
MA

P
PR N OM ,N OM
D 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)

NU

MP

NU

NUM F=N UMF

TITRE = Les misrables

MP NU

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

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

NUMF = NUMF

D
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)

GROUP BY NUMF ) AS X WHERE F.NUMF = X.NUMF AND F.RALISATEUR IN ( SELECT NUMP FROM PERSONNE WHERE NOM = Spielberg ) 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)

AND AND AND AND AND AND AND AND AND AND

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 HORAIRE < 22:00

= MC NU

MC NU

NUMC = NUMC

NUMF = NUMF

RALISA TE

UR = NU MA
NOM = Spielberg

S
NUMS = NUMS

F PR
E TR TI

C
NO M

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 )

Graphe de la requte :

NUMF = NUMF

NUMC = NUMC

COMPAGNIE = Fox

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 ) Requte 18 : Trouver le titre des films qui ne passent aucun cinma de la compagnie FOX. On commence par poser la requte inverse : les films qui passent dans un (au moins) cinma de la Fox. 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 Corrig du TD SQL (BD-Filmographie)

F
N U

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

M F, TI TR E

Res

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

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

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)

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

F
NUMF = NUMF

PRNOM, NOM

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

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)

NU

MP

NU

MA

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 Graphe de la requte :
NUMF = NUMF

---AND AND AND AND

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 )

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 }

RA LISA TEU R

D1
NUMA =

F1
RALIS ATEUR
MP

= NU

MA
NUMP > NUMP

NUM

AL = R

ISAT

EUR

NUMF = NUMF

F1
ATEUR = NUM A

D1

P1

P1
RALIS
NUM

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

NUMA = NU

P = NUMA

PRNOM, NOM

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 ) )

{ 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

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)

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 ) ) )

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) :

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

{ 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