Corrigé Contrôle de connaissance

Transcription

Corrigé Contrôle de connaissance
Ecole Supérieure de la Statistique et de l’Analyse de l’Information
‫اﻟﻣدرﺳﺔ اﻟﻌﻠﯾﺎ ﻟﻺﺣﺻﺎء وﺗﺣﻠﯾل اﻟﻣﻌﻠوﻣﺎت ﺑﺗوﻧس‬
Corrigé Contrôle de connaissance
Bases de données (2011/2012)
2ème année ESSAI – Proposé par Fatma CHAKER
Soit le schéma relationnel suivant :
Salle (NomS, Horaire, capacité, Titre*)
Film (Titre, réalisateur, durée, acteur)
Producteur (Producteur, Titre*)
Vu (Spectateur, Titre*)
Aime (Amateur, Titre*)
Sachant que :

Un film peut être produit par plusieurs producteurs

La relation Vu décrit les titres des films vus par les spectateurs. Evidemment un
spectateur peut voir plusieurs films

La relation Aime décrit les films appréciés par les spectateurs (amateurs). Evidemment,
un spectateur peut aimer plusieurs films.
1- Exprimez en Algèbre relationnelle ET en SQL les requêtes 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 qu’ils 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 Supérieure de la Statistique et de l’Analyse de l’Information
‫اﻟﻣدرﺳﺔ اﻟﻌﻠﯾﺎ ﻟﻺﺣﺻﺎء وﺗﺣﻠﯾل اﻟﻣﻌﻠوﻣﺎت ﺑﺗوﻧس‬
Corrigé Contrôle de connaissance
Bases de données (2011/2012)
2ème année ESSAI – Proposé par Fatma CHAKER
Soit le modèle relationnel suivant :
Usine (N°usine, NomU, Ville)
Produit (N°Prod, NomP, couleur, Poids)
Fournisseur (NumF, NomF, statut, villeF)
Livrer (N°usine*, N°Prod*, NumF*, Quantité)
1)- Proposez une définition des tables Produit et Livrer en prenant en compte les contraintes suivantes :
* La quantité doit être non nulle
* Si un produit est supprimé, l’ensemble de l’information qui en dépend doit être remise à zéro de la base
* la couleur d’un produit est soit rouge, noir ou blanc
NB : on suppose que les tables Usine et Fournisseur sont déjà créées
CREATE TABLE Produit (
N°Prod INTEGER,
NomP CHAR(20),
CouleurCHAR(15),
Poids
NUMBER(6,2),
PRIMARY KEY N°Prod,
CHECK couleur IN(‘rouge’,’noir’,’blanc’));
CREATE TABLE livrer (
N°usine
INTEGER,
N°Prod INTEGER,
NumF
INTEGER,
Quantité
NUMBER(6,2),
PRIMARY KEY (N°usine, N°Prod, NumF ),
FOREIGN KEY N°usine REFERENCES Usine,
FOREIGN KEY N°Prod REFERENCES Produit ON DELETE SET NULL,
FOREIGN KEY NumF REFERENCES Fournisseur,
CHECK (Quantité >0));
2) Insérez les données suivantes dans la table Produit :
N°Prod = 15, NomP=’table’,Poids=2
INSERT INTO Produit (N°Prod, NomP, Poids) VALUES (15, ‘table’,2) ;
3)- Exprimez les requêtes suivantes en SQL :
a)- Donner pour chaque fournisseur (numéro et nom) le nombre de produits qu’il propose ?
SELECT NumF, NomF, COUNT(N°Prod) AS NBR
FROM Fournisseur A, Livrer B
WHERE A.NumF=B.NumF
GROUP BY NumF, NomF;
b)- Quels sont les fournisseurs (numéro et noms) qui proposent au moins 5 produits ?
SELECT NumF, NomF, COUNT(N°Prod) AS NBR
FROM Fournisseur A, Livrer B
WHERE A.NumF=B.NumF
GROUP BY NumF, NomF
HAVING COUNT(N°Prod)>=5;
c)- Quelle est la quantité moyenne livrée de chaque produit par chaque fournisseur ?
SELECT NumF, N°Prod, AVG(Quantité) AS moy
FROM Livrer
GROUP BY NumF, N°Prod;
d) Donner les numéros des produits qui sont livrés à toutes les usines de Tunis ?
SELECT N°Prod
FROM Produit A
WHERE NOT EXISTS (SELECT *
FROM Usine B
WHERE ville=’Tunis’
AND NOT EXISTS
(SELECT *
FROM Livrer C
WHERE A.N°Prod=C.N°Prod
AND B.N°Usine=C.N°Usine));
Question BONUS :
Quel est le rôle de cette requête ?
SELECT N°Prod, NomP
FROM Produit A, Livrer B
WHERE A. N°Prod=B. N°Prod
AND Quantité > ALL (SELECT Quantité
FROM Livrer C, Produit D
WHERE A.couleur=D.couleur) ;
Quels sont les produits (N°Prod, NomP ) dont la quantité livrée est supérieure à chacune des
quantités livrées des produits de même couleur ;
Ecole Supérieure de la Statistique et de l’Analyse de l’Information
‫اﻟﻣدرﺳﺔ اﻟﻌﻠﯾﺎ ﻟﻺﺣﺻﺎء وﺗﺣﻠﯾل اﻟﻣﻌﻠوﻣﺎت ﺑﺗوﻧس‬
Corrigé Contrôle de connaissance
Bases de données (2011/2012)
2ème année ESSAI – Proposé par Fatma CHAKER
Soit le modèle relationnel suivant :
FILMS (Titre, Pays, Année, Réalisateur, Durée)
Acteurs (Titre*,Acteur*)
1)- Exprimez les requêtes suivantes en Algèbre relationnelle et en SQL
a)- Trouvez les acteurs qui ont tourné avec TRUFFAUT comme réalisateur ?
AR :
R1= selection (FILMS, réalisateur=’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 réalisateur =’TRUFFAUT’ ;
b)- Titre des films où le réalisateur est aussi acteur ?
AR :
R1= Jointure(FILMS, Acteurs, FILMS.Titre=Acteurs.Titre)
R2= selection(R1, acteur=réalisateur)
R3= projection (R2, Titre)
SQL :
SELECT Titre
FROM FILMS A, Acteurs B
WHERE A.Titre=B.Titre
AND Acteur=réalisateur;
c)- Quels sont les acteurs qui jouent dans tous les films de ‘
TRUFFAUT’
AR :
R1 = selection (FILMS, réalisateur=’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 réalisateur =’TRUFFAUT’
AND A.Titre=B.Titre)) ;
d)- quels sont les réalisateurs qui ont réalisé plus que 10 films ?
AR :
R1= regrouper_et_calculer(FILMS, réalisateur, N : comptage(Titre))
R2= selection(R1, N>10)
R3= projection (R2, réalisateur)
SQL :
SELECT
réalisateur , COUNT(Titre) AS ‘Nombre de films’
FROM FILMS
GROUP BY réalisateur
HAVING COUNT(Titre)>10 ;
e)- Quels sont les réalisateurs dont le nombre de films réalisé dépasse celui du réalisateur
TRUFFAUT ?
AR :
R1= regrouper_et_calculer(FILMS, réalisateur, N1: comptage(Titre)) /* le nombre de films réalisé
pour chaque réalisateur */
R2= selection (FILMS, réalisateur=’TRUFFAUT’)
N2 = Calculer (R2, comptage(Titre))
R3 = selection (R1, N1>N2)
R4 = projection (R3, réalisateur)
SQL :
SELECT réalisateur
FROM FILMS
GROUP BY réalisateur
HAVING COUNT(Titre) > (SELECT COUNT(Titre)
FROM FILMS
WHERE réalisateur =’TRUFFAUT’));

Documents pareils