Vous êtes sur la page 1sur 9

Ecole Suprieure de la Statistique et de lAnalyse de lInformation

Corrig Contrle de connaissance


Bases de donnes (2011/2012)
2me anne ESSAI Propos par Fatma CHAKER

Soit le schma relationnel suivant :


Salle (NomS, Horaire, capacit, Titre*)
Film (Titre, ralisateur, dure, acteur)
Producteur (Producteur, Titre*)
Vu (Spectateur, Titre*)
Aime (Amateur, Titre*)
Sachant que :

Un film peut tre produit par plusieurs producteurs

La relation Vu dcrit les titres des films vus par les spectateurs. Evidemment un
spectateur peut voir plusieurs films

La relation Aime dcrit les films apprcis par les spectateurs (amateurs). Evidemment,
un spectateur peut aimer plusieurs films.

1- Exprimez en Algbre relationnelle ET en SQL les requtes suivantes :


a)- O et quel horaire peut on voir le film Ma belle Tunisie ?
AR :

R1= Selection(Salle, Titre=Ma belle Tunisie


R2= Projection (R1, Horaire, NomS)
SQL :
SELECT NomS, Horaire
FROM Salle
WHERE Titre=Ma belle Tunisie ;
b)- Quels sont les acteurs qui jouent dans tous les films ?
AR :
R1= Projection(Film, Titre)
R2= Projection(Film, Titre, acteur)
R3= Division(R2,R1)
SQL :
SELECT acteur
FROM Film
GROUP BY acteur
HAVING COUNT(Titre)=(SELECT COUNT(*)
FROM Film);
c)- Quels sont les spectateurs qui aiment tous les films quils voient ?
AR :
R1= Regrouper_et_calculer(Vu, Spectateur, N1=comptage(Titre))
R2= Regrouper_et_calculer(Aime, Amateur, N2=comptage(Titre))
R3= jointure(R1,R2, Spectateur=Amateur)
R4= selection (R3, N1=N2)
R5= projection(R4, Spectateur)

SQL:
SELECT spectateur
FROM Vu
GROUP BY spectateur
HAVING COUNT(Titre)=(SELECT COUNT(Titre)
FROM Aime
GROUP BY Amateur)

Ecole Suprieure de la Statistique et de lAnalyse de lInformation

Corrig Contrle de connaissance


Bases de donnes (2011/2012)
2me anne ESSAI Propos par Fatma CHAKER

Soit le modle relationnel suivant :


Usine (Nusine, NomU, Ville)
Produit (NProd, NomP, couleur, Poids)
Fournisseur (NumF, NomF, statut, villeF)
Livrer (Nusine*, NProd*, NumF*, Quantit)
1)- Proposez une dfinition des tables Produit et Livrer en prenant en compte les contraintes suivantes :
* La quantit doit tre non nulle
* Si un produit est supprim, lensemble de linformation qui en dpend doit tre remise zro de la base
* la couleur dun produit est soit rouge, noir ou blanc
NB : on suppose que les tables Usine et Fournisseur sont dj cres
CREATE TABLE Produit (
NProd INTEGER,
NomP CHAR(20),
CouleurCHAR(15),
Poids
NUMBER(6,2),
PRIMARY KEY NProd,
CHECK couleur IN(rouge,noir,blanc));
CREATE TABLE livrer (
Nusine
INTEGER,
NProd INTEGER,
NumF
INTEGER,
Quantit
NUMBER(6,2),

PRIMARY KEY (Nusine, NProd, NumF ),


FOREIGN KEY Nusine REFERENCES Usine,
FOREIGN KEY NProd REFERENCES Produit ON DELETE SET NULL,
FOREIGN KEY NumF REFERENCES Fournisseur,
CHECK (Quantit >0));
2) Insrez les donnes suivantes dans la table Produit :
NProd = 15, NomP=table,Poids=2
INSERT INTO Produit (NProd, NomP, Poids) VALUES (15, table,2) ;
3)- Exprimez les requtes suivantes en SQL :
a)- Donner pour chaque fournisseur (numro et nom) le nombre de produits quil propose ?
SELECT NumF, NomF, COUNT(NProd) AS NBR
FROM Fournisseur A, Livrer B
WHERE A.NumF=B.NumF
GROUP BY NumF, NomF;
b)- Quels sont les fournisseurs (numro et noms) qui proposent au moins 5 produits ?
SELECT NumF, NomF, COUNT(NProd) AS NBR
FROM Fournisseur A, Livrer B
WHERE A.NumF=B.NumF
GROUP BY NumF, NomF
HAVING COUNT(NProd)>=5;
c)- Quelle est la quantit moyenne livre de chaque produit par chaque fournisseur ?
SELECT NumF, NProd, AVG(Quantit) AS moy
FROM Livrer
GROUP BY NumF, NProd;
d) Donner les numros des produits qui sont livrs toutes les usines de Tunis ?
SELECT NProd
FROM Produit A
WHERE NOT EXISTS (SELECT *
FROM Usine B
WHERE ville=Tunis
AND NOT EXISTS
(SELECT *
FROM Livrer C
WHERE A.NProd=C.NProd
AND B.NUsine=C.NUsine));
Question BONUS :
Quel est le rle de cette requte ?
SELECT NProd, NomP
FROM Produit A, Livrer B

WHERE A. NProd=B. NProd


AND Quantit > ALL (SELECT Quantit
FROM Livrer C, Produit D
WHERE A.couleur=D.couleur) ;
Quels sont les produits (NProd, NomP ) dont la quantit livre est suprieure chacune des
quantits livres des produits de mme couleur ;

Ecole Suprieure de la Statistique et de lAnalyse de lInformation

Corrig Contrle de connaissance


Bases de donnes (2011/2012)
2me anne ESSAI Propos par Fatma CHAKER

Soit le modle relationnel suivant :


FILMS (Titre, Pays, Anne, Ralisateur, Dure)
Acteurs (Titre*,Acteur*)
1)- Exprimez les requtes suivantes en Algbre relationnelle et en SQL
a)- Trouvez les acteurs qui ont tourn avec TRUFFAUT comme ralisateur ?
AR :
R1= selection (FILMS, ralisateur=TRUFFAUT)
R2= Jointure (R1, Acteurs, R1.Titre=Acteurs.Titre)
R3= Projection(R2, acteur)
SQL
SELECT Acteur
FROM FILMS A, Acteurs B
WHERE A.Titre=B.Titre
AND ralisateur =TRUFFAUT ;
b)- Titre des films o le ralisateur est aussi acteur ?
AR :

R1= Jointure(FILMS, Acteurs, FILMS.Titre=Acteurs.Titre)


R2= selection(R1, acteur=ralisateur)
R3= projection (R2, Titre)
SQL :
SELECT Titre
FROM FILMS A, Acteurs B
WHERE A.Titre=B.Titre
AND Acteur=ralisateur;
c)- Quels sont les acteurs qui jouent dans tous les films de

TRUFFAUT

AR :
R1 = selection (FILMS, ralisateur=TRUFFAUT)
R2= projection (R1,Titre) /* tous les films de TRUFFAUT
R3= division(Acteurs , R2)
SQL :
SELECT Acteur
FROM Acteurs A
WHERE NOT EXISTS ( SELECT *
FROM FILMS B
WHERE ralisateur =TRUFFAUT
AND A.Titre=B.Titre)) ;
d)- quels sont les ralisateurs qui ont ralis plus que 10 films ?
AR :
R1= regrouper_et_calculer(FILMS, ralisateur, N : comptage(Titre))
R2= selection(R1, N>10)
R3= projection (R2, ralisateur)
SQL :
SELECT
ralisateur , COUNT(Titre) AS Nombre de films
FROM FILMS
GROUP BY ralisateur
HAVING COUNT(Titre)>10 ;
e)- Quels sont les ralisateurs dont le nombre de films ralis dpasse celui du ralisateur
TRUFFAUT ?
AR :

R1= regrouper_et_calculer(FILMS, ralisateur, N1: comptage(Titre)) /* le nombre de films ralis


pour chaque ralisateur */
R2= selection (FILMS, ralisateur=TRUFFAUT)
N2 = Calculer (R2, comptage(Titre))
R3 = selection (R1, N1>N2)
R4 = projection (R3, ralisateur)
SQL :
SELECT ralisateur
FROM FILMS
GROUP BY ralisateur
HAVING COUNT(Titre) > (SELECT COUNT(Titre)
FROM FILMS
WHERE ralisateur =TRUFFAUT));