- Exercice Langage SQL : BD Cinéma (Partie 4) - Licence Fondamentale d'Informatique
lundi 25 mars 2013

Exercice Langage SQL : BD Cinéma (Partie 4)


Enoncé de l'Exercice (BD Cinéma Suite):
Les attributs NUM, NUM, NUMA, NUMC, NUMS sont des identifiants uniques (clés primaires) pour respectivement : FILM, PERSONNE, ACTEUR, CINÉMA, SALLE.
Un de ces attributs utilisé comme attribut d’une autre relation est une clé étrangère qui renvoie à la clé primaire de la relation correspondante, par exemple dans GÉNÉRIQUE, NUMF renvoie au NUMF de FILM et est défini sur le même domaine.
De plus, les attributs RÉALISATEUR dans FILM et NUMA dans ACTEUR sont définis sur le domaine des NUMP, et renvoient au NUMP de la personne correspondante.

SQ1
Schéma complémentaire
                                    RÉCOMPENSE (NUMR, CATÉGORIE, FESTIVAL)
                                    RÉCOMPENSE_FILM (NUMF, ANNÉE, NUMR)
                                    RÉCOMPENSE_ACTEUR (NUMA, NUMF, ANNÉE, NUMR)
Pour répondre aux questions suivantes, il faut noter que lorsqu'un acteur reçoit une récompense, le film en reçoit une indirectement.
Ce schéma complémentaire conduit à utiliser une union dans les requêtes.

Réaliser les Requêtes suivantes:
Requête 24 : Donner le titre des films qui ont été primés au moins une fois (y compris les récompenses des acteurs jouant dans le film).
Requête 25 : Lister les cinémas qui ont exclusivement passé des films primés.
Requête 26 : Donner le titre des films qui ont reçu au moins trois récompenses.
Requête 27 : Noms et prénoms des acteurs qui ont reçu plus de récompenses qu'aucun acteur qui a joué dans "Casablanca" n'en a eu.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Requête 24 : Donner le titre des films qui ont été primés au moins une fois (y compris les récompenses des acteurs jouant dans le film).
 
Forme plate:
 SELECT DISTINCT F.TITRE, F.ANNÉE
 FROM FILM F, RÉCOMPENSE_FILM RF
 WHERE F.NUMF = RF.NUMF
 UNION
 SELECT DISTINCT F.TITRE, F.ANNÉE
 FROM FILM F, RÉCOMPENSE_ACTEUR RA
WHERE F.NUMF = RA.NUMF
 
Forme imbriquée:
 SELECT TITRE, ANNÉE
 FROM FILM
 WHERE NUMF IN (
      SELECT NUMF
      FROM RÉCOMPENSE_FILM
      UNION
      SELECT NUMF FROM RÉCOMPENSE_ACTEUR )
 
Requête 25 : Lister les cinémas qui ont exclusivement passé des films primés.
 
Forme imbriquée:
 SELECT NOM, VILLE
 FROM CINÉMA C
 WHERE NOT EXISTS (
      SELECT * FROM PASSE P
      WHERE P.NUMC = C.NUMC
      AND NOT EXISTS (SELECT * FROM RÉCOMPENSE_FILM RF
           WHERE RF.NUMF = P.NUMF )
      ANDNOT EXISTS (
           SELECT * FROM RÉCOMPENSE_ACTEUR RA
WHERE RA.NUMF = P.NUMF ) )
 
Forme imbriquée– prédicat NOT EXISTS :
 SELECT NOM, VILLE
 FROM CINÉMA C
 WHERE NOT EXISTS (
      SELECT * FROM PASSE P
      WHERE P.NUMC = C.NUMC
      AND NOT EXISTS ( SELECT * FROM (
                SELECT NUMF
                FROM RÉCOMPENSE_FILM
                UNION
                SELECT NUMF
                FROM RÉCOMPENSE_ACTEUR ) AS R
WHERE R.NUMF = P.NUMF ) )
 
 
Forme imbriquée – prédicat NOT IN :
 SELECT NOM, VILLE
 FROM CINÉMA
 WHERE NUMC NOT IN (
      SELECT NUMC
      FROM PASSE
      WHERE NUMF NOT IN (
           SELECT R.NUMF FROM (
                SELECT NUMF
                FROM RÉCOMPENSE_FILM
                UNION
                SELECT NUMF
                FROM RÉCOMPENSE_ACTEUR ) AS R ) ) )
 
Requête 26 : Donner le titre des films qui ont reçu au moins trois récompenses.
 
Forme imbriquée:
 SELECT TITRE, ANNÉE
 FROM FILM
 WHERE NUMF IN (
      SELECT R.NUMF
      FROM (
           SELECT NUMF
           FROM RÉCOMPENSE_FILM
           UNION
           SELECT NUMF
           FROM RÉCOMPENSE_ACTEUR ) AS R
      GROUP BY R.NUMF
      HAVING COUNT (*) >= 3 ) 
Requête 27 : Noms et prénoms des acteurs qui ont reçu plus de récompenses qu”'”aucun acteur qui a joué dans "Casablanca" n”'”en a eu.
 
Forme imbriquée:
 SELECT PRÉNOM, NOM
 FROM PERSONNE
 WHERE NUMP IN (
      SELECT NUMA
      FROM RÉCOMPENSE_ACTEUR
      GROUP BY NUMA
      HAVING COUNT (*) > (
           SELECT MAX (
                SELECT COUNT (*)
                FROM RÉCOMPENSE_ACTEUR
                WHERE NUMA IN (
                    SELECT NUMA
                    FROM DISTRIBUTION
                    WHERE NUMF IN (
                         SELECT NUMF
                         FROM FILM
                         WHERE TITRE = ‘Casablanca’))
                GROUP BY NUMA)))

0 commentaires:

Enregistrer un commentaire

 
-