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