Correction de l

14
Correction de l'exercice d'application n°1 REPRESENTATION (n°représentation , titre_représentation, lieu) MUSICIEN (nom , n°représentation*) PROGRAMMER (date, n°représentation* , tarif) 1 - Donner la liste des titres des représentations. R = PROJECTION(REPRESENTATION, titre_représentation) Et en langage SQL... SELECT titre_représentation FROM REPRESENTATION ; 2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille. R1 = SELECTION(REPRESENTATION, lieu="Opéra Bastille") R2 = PROJECTION(R1, titre_représentation) Et en langage SQL... SELECT titre_représentation FROM REPRESENTATION WHERE lieu="Opéra Bastille" ; 3 - Donner la liste des noms des musiciens et des titres des représentations auxquelles ils participent. R1 = JOINTURE(MUSICIEN, REPRESENTATION, Musicien.n°représentation=Représentation.n°représentation ) R2 = PROJECTION(R1, nom, titre_représentation) Et en langage SQL... SELECT nom, titre_représentation FROM MUSICIEN INNER JOIN REPRESENTATION ON MUSICIEN.n°représentation = REPRESENTATION.n°représentation ; 4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la journée du 14/09/96. R1 = SELECTION(PROGRAMMER, date=14/09/96) R2 = JOINTURE(R1, REPRESENTATION,

Transcript of Correction de l

Page 1: Correction de l

Correction de l'exercice d'application n°1  REPRESENTATION (n°représentation, titre_représentation, lieu) MUSICIEN (nom, n°représentation*) PROGRAMMER (date, n°représentation*, tarif)1 - Donner la liste des titres des représentations. R = PROJECTION(REPRESENTATION, titre_représentation)Et en langage SQL...SELECT titre_représentation FROM REPRESENTATION ;2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille.R1 = SELECTION(REPRESENTATION, lieu="Opéra Bastille") R2 = PROJECTION(R1, titre_représentation)Et en langage SQL...SELECT titre_représentation FROM REPRESENTATIONWHERE lieu="Opéra Bastille" ;3 - Donner la liste des noms des musiciens et des titres des représentations auxquelles ils participent. R1 = JOINTURE(MUSICIEN, REPRESENTATION, Musicien.n°représentation=Représentation.n°représentation) R2 = PROJECTION(R1, nom, titre_représentation)Et en langage SQL...SELECT nom, titre_représentationFROM MUSICIEN INNER JOIN REPRESENTATION ON MUSICIEN.n°représentation = REPRESENTATION.n°représentation ;4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la journée du 14/09/96.R1 = SELECTION(PROGRAMMER, date=14/09/96) R2 = JOINTURE(R1, REPRESENTATION, R1.n°représentation=Représentation.n°représentation) R3 = PROJECTION(R2, titre_représentation, lieu, tarif)Et en langage SQL...SELECT titre_représentation, lieu, tarifFROM REPRESENTATION INNER JOIN PROGRAMMER ON PROGRAMMER.n°représentation = REPRESENTATION.n°représentationWHERE date='14/06/96' ; 

Page 2: Correction de l
Page 3: Correction de l

Correction de l'exercice d'application n°2  ETUDIANT(N°Etudiant, Nom, Prénom) MATIERE(CodeMat, LibelléMat, CoeffMat) EVALUER(N°Etudiant*, CodeMat*, Date, Note)1 - Quel est le nombre total d'étudiants ? N=CALCULER(ETUDIANT, Comptage())Et en langage SQL...SELECT COUNT(*) FROM ETUDIANT ;2 - Quelles sont, parmi l'ensemble des notes, la note la plus haute et la note la plus basse ? R=CALCULER(EVALUER, Minimum(Note), Maximum(Note))Et en langage SQL...SELECT MIN(Note), MAX(Note) FROM EVALUER ;3 - Quelles sont les moyennes de chaque étudiant dans chacune des matières ? R1=REGROUPER_ET_CALCULER(EVALUER, N°Etudiant, CodeMat, MoyEtuMat : Moyenne(Note)) R2=JOINTURE(R1, MATIERE, MATIERE.CodeMat=R1.CodeMat) R3=JOINTURE(R2, ETUDIANT, ETUDIANT.N°Etudiant=R2.N°Etudiant) MOYETUMAT=PROJECTION(R3, N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat, MoyEtuMat)Et en langage SQL...CREATE VIEW MOYETUMAT ASSELECT ETUDIANT.N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat, AVG(Note) AS MoyEtuMatFROM EVALUER INNER JOIN MATIERE ON EVALUER.CodeMat = MATIERE.CodeMatINNER JOIN ETUDIANT ON EVALUER.N°Etudiant = ETUDIANT.N°EtudiantGROUP BY ETUDIANT.N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat;Remarque : la commande CREATE VIEW va permettre de réutiliser le résultat de la requête (notamment aux deux questions suivantes) comme s'il s'agissait d'une nouvelle table (bien qu'elle soit regénérée dynamiquement lors de son utilisation).Sous Access, il ne faut pas utiliser la commande CREATE VIEW mais seulement enregistrer la requête. Il est alors possible de s'en resservir comme une table.

Page 4: Correction de l

4 - Quelles sont les moyennes par matière ?Idem question 3 puis : R4=REGROUPER_ET_CALCULER(MOYETUMAT, LibelléMat, Moyenne(MoyEtuMat))Et en langage SQL...Avec la vue MOYETUMAT de la question 3 :SELECT LibelléMat, AVG(MoyEtuMat)FROM MOYETUMATGROUP BY LibelléMat ;5 - Quelle est la moyenne générale de chaque étudiant ? Idem question 3 puis :MGETU=REGROUPER_ET_CALCULER(MOYETUMAT, N°Etudiant, Nom, Prénom, MgEtu : Somme(MoyEtuMat*CoeffMat)/Somme(CoeffMat)) Et en langage SQL...Avec la vue MOYETUMAT de la question 3 :CREATE VIEW MGETU ASSELECT N°Etudiant, Nom, Prénom, SUM(MoyEtuMat*CoeffMat)/SUM(CoeffMat) AS MgEtuFROM MOYETUMATGROUP BY N°Etudiant, Nom, Prénom ;6 - Quelle est la moyenne générale de la promotion ? Idem question 5 puis :MG=CALCULER(MGETU, Moyenne(MgEtu)) Et en langage SQL...Avec la vue MGETU de la question 5 :SELECT AVG(MgEtu) FROM MGETU ;7 - Quels sont les étudiants qui ont une moyenne générale supérieure ou égale à la moyenne générale de la promotion ? Idem question 5 et 6 puis : R=SELECTION(MGETU, MgEtu>=MG)Et en langage SQL...Avec la vue MGETU de la question 5 :SELECT N°Etudiant, Nom, Prénom, MgEtuFROM MGETUWHERE MgEtu >= (SELECT AVG(MgEtu) FROM MGETU) ;

Page 5: Correction de l

Correction de l'exercice d'application n°3  EQUIPE(CodeEquipe, NomEquipe, DirecteurSportif) COUREUR(NuméroCoureur, NomCoureur, CodeEquipe*, CodePays*) PAYS(CodePays, NomPays) TYPE_ETAPE(CodeType, LibelléType) ETAPE(NuméroEtape, DateEtape, VilleDép, VilleArr, NbKm, CodeType*) PARTICIPER(NuméroCoureur*, NuméroEtape*, TempsRéalisé) ATTRIBUER_BONIFICATION(NuméroEtape*, km, Rang, NbSecondes, NuméroCoureur*)1 - Quelle est la composition de l'équipe FESTINA (Numéro, nom et pays des coureurs) ? R1=SELECTION(EQUIPE, NomEquipe="FESTINA") R2=JOINTURE(R1, COUREUR, R1.CodeEquipe=COUREUR.CodeEquipe) R3=JOINTURE(R2, PAYS, R2.CodePays=PAYS.CodePays) R4=PROJECTION(R3, NuméroCoureur, NomCoureur, NomPays)Et en langage SQL...SELECT NuméroCoureur, NomCoureur, NomPaysFROM EQUIPE A INNER JOIN COUREUR B ON A.CodeEquipe=B.CodeEquipeINNER JOIN PAYS C ON B.CodePays=C.CodePaysWHERE NomEquipe="FESTINA" ;2 - Quel est le nombre de kilomètres total du Tour de France 97 ? N=CALCULER(ETAPE, SOMME(NbKm))Et en langage SQL...SELECT SUM(Nbkm) FROM ETAPE ;3 - Quel est le nombre de kilomètres total des étapes de type HAUTE MONTAGNE ? R1=SELECTION(TYPE_ETAPE, LibelléType="HAUTE MONTAGNE") R2=JOINTURE(R1, ETAPE, R1.CodeType=ETAPE.CodeType) N=CALCULER(R2, SOMME(NbKm))Et en langage SQL...SELECT SUM(Nbkm) FROM ETAPE A INNER JOIN TYPE_ETAPE B ON A.CodeType=B.CodeTypeWHERE LibelléType="HAUTE MONTAGNE" ;4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ? 

Page 6: Correction de l

R1=PROJECTION(COUREUR, NuméroCoureur) R2=PROJECTION(ATTRIBUER_BONIFICATION, NuméroCoureur) R3=DIFFERENCE(R1,R2) R4=JOINTURE(R3, COUREUR, R3.NuméroCoureur=COUREUR.NuméroCoureur) R5=PROJECTION(R4, NomCoureur)Et en langage SQL...SELECT NomCoureur FROM COUREURWHERE NuméroCoureur NOT IN (SELECT NuméroCoureur FROM ATTRIBUER_BONIFICATION) ;ouSELECT NomCoureur FROM COUREUR C LEFT JOIN ATTRIBUER_BONIFICATION A ON C.NuméroCoureur=A.NuméroCoureurWHERE A.NuméroCoureur IS NULL ;  5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ? R1=PROJECTION(PARTICIPER, NuméroCoureur, NuméroEtape) R2=PROJECTION(ETAPE, NuméroEtape) R3=DIVISION(R1, R2) R4=JOINTURE(R3, COUREUR, R3.NuméroCoureur=COUREUR.NuméroCoureur) R5=PROJECTION(R4, NomCoureur)ouN=CALCULER(ETAPE, Comptage()) R1=REGROUPER_ET_CALCULER(PARTICIPER, NuméroCoureur, Nb:Comptage()) R2=SELECTION(R1, Nb=N) R3=JOINTURE(R2, COUREUR, R2.NuméroCoureur=COUREUR.NuméroCoureur) R4=PROJECTION(R3, NomCoureur)Et en langage SQL...SELECT NomCoureur FROM PARTICIPER A INNER JOIN COUREUR B ON A.NuméroCoureur=B.NuméroCoureurGROUP BY NuméroCoureur, NomCoureurHAVING COUNT(*)=(SELECT COUNT(*) FROM ETAPE) ;6 - Quel est le classement général des coureurs (nom, code équipe, code pays et temps des coureurs) à l'issue des 13 premières étapes sachant que les bonifications ont été

Page 7: Correction de l

intégrées dans les temps réalisés à chaque étape ? R1=SELECTION(PARTICIPER, NuméroEtape=13) R2=PROJECTION(R1, NuméroCoureur)     -> R2 représente l'ensemble des coureurs présents jusqu'à la 13ème étape (ce qui va permettre de ne pas prendre en compte dans le classement ceux qui ont abandonné avant !) R3=JOINTURE(R2, PARTICIPER, R2.NuméroCoureur=PARTICIPER.NuméroCoureur) R4=SELECTION(R3, NuméroEtape<=13) R5=REGROUPER_ET_CALCULER(R4, NuméroCoureur, Total:Somme(TempsRéalisé)) R6=JOINTURE(R5, COUREUR, R5.NuméroCoureur=COUREUR.NuméroCoureur) R7=PROJECTION(R6, NomCoureur, CodeEquipe, CodePays, Total) R8=TRI(R7, Totalé)Et en langage SQL...SELECT NomCoureur, CodeEquipe, CodePays, SUM(TempsRéalisé) AS TotalFROM PARTICIPER A INNER JOIN COUREUR B ON A.NuméroCoureur=B.NuméroCoureur  WHERE NuméroEtape<=13 AND A.NuméroCoureur IN (SELECT NuméroCoureur FROM PARTICIPER WHERE NuméroEtape=13)GROUP BY A.NuméroCoureur, NomCoureur, CodeEquipe, CodePays ORDER BY 4 ;

Page 8: Correction de l

Exercice n°1 :

Soit le modèle relationnel suivant relatif à une base de données sur des représentations

musicales : 

REPRESENTATION (n°représentation, titre_représentation, lieu) 

MUSICIEN (nom, n°représentation*) 

PROGRAMMER (date, n°représentation*, tarif) 

Remarque : les clés primaires sont soulignées et les clés étrangères

sont marquées par *

Questions : 

1 - Donner la liste des titres des représentations. 

2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille. 

3 - Donner la liste des noms des musiciens et des titres des représentations auxquelles ils

participent. 

4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la journée du

14/09/96. 

Exercice n°2 :

Soit le modèle relationnel suivant relatif à la gestion simplifiée des étapes du Tour de

France 97, dont une des étapes de type "contre la montre individuel" se déroula à Saint-

Etienne : 

EQUIPE(CodeEquipe, NomEquipe, DirecteurSportif) 

COUREUR(NuméroCoureur, NomCoureur, CodeEquipe*, CodePays*) 

PAYS(CodePays, NomPays) 

TYPE_ETAPE(CodeType, LibelléType) 

ETAPE(NuméroEtape, DateEtape, VilleDép, VilleArr, NbKm, CodeType*) 

PARTICIPER(NuméroCoureur*, NuméroEtape*, TempsRéalisé) 

ATTRIBUER_BONIFICATION(NuméroEtape*, km, Rang, NbSecondes,

NuméroCoureur*) 

Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées

par *  

Page 9: Correction de l

Questions : 

1 - Quelle est la composition de l'équipe Festina (Numéro, nom et pays des

coureurs) ? 

2 - Quel est le nombre de kilomètres total du Tour de France 97 ? 

3 - Quel est le nombre de kilomètres total des étapes de type "Haute

Montagne"? 

4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ? 

5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ? 

6 - Quel est le classement général des coureurs (nom, code équipe, code pays

et temps des coureurs) à l'issue des 13 premières étapes sachant que les 

bonifications ont été intégrées dans les temps réalisés à chaque étape ? 

7 - Quel est le classement par équipe à l'issue des 13 premières étapes (nom et

temps des équipes) ?

Page 10: Correction de l

Correction de l'exercice n°1

1 - Donner la liste des titres des représentations. 

SELECT titre_représentation FROM REPRESENTATION ; 

2 - Donner la liste des titres des représentations ayant lieu à l'opéra

Bastille. 

SELECT titre_représentation FROM REPRESENTATION 

WHERE lieu="Opéra Bastille" ; 

3 - Donner la liste des noms des musiciens et des titres des

représentations auxquelles ils participent. 

SELECT nom, titre_représentation 

FROM MUSICIEN, REPRESENTATION 

WHERE MUSICIEN.n°représentation = REPRESENTATION.n°représentation ; 

4 - Donner la liste des titres des représentations, les lieux et les tarifs

pour la journée du 14/09/96.  

SELECT titre_représentation, lieu, tarif 

FROM REPRESENTATION, PROGRAMMER 

WHERE PROGRAMMER.n°représentation = 

REPRESENTATION.n°représentation 

          AND date='14/06/96' ; 

Correction de l'exercice n°2  

1 - Quelle est la composition de l'équipe FESTINA (Numéro, nom et

pays des coureurs) ? 

SELECT NuméroCoureur, NomCoureur, NomPays 

FROM EQUIPE A, COUREUR B, PAYS C 

Page 11: Correction de l

WHERE A.CodeEquipe=B.CodeEquipe And B.CodePays=C.CodePays 

And NomEquipe="FESTINA" ; 

2 - Quel est le nombre de kilomètres total du Tour de France 97 ?

SELECT SUM(Nbkm) FROM ETAPE ;  

3 - Quel est le nombre de kilomètres total des étapes de type HAUTE MONTAGNE ? 

SELECT SUM(Nbkm) FROM ETAPE A, TYPE_ETAPE B 

WHERE A.CodeType=B.CodeType And LibelléType="HAUTE MONTAGNE" ;  

4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ? 

SELECT NomCoureur FROM COUREUR 

WHERE NuméroCoureur NOT IN (SELECT NuméroCoureur FROM 

ATTRIBUER_BONIFICATION) ;  

5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ? 

SELECT NomCoureur FROM PARTICIPER A, COUREUR B 

WHERE A.NuméroCoureur=B.NuméroCoureur 

GROUP BY NuméroCoureur, NomCoureur 

HAVING COUNT(*)=(SELECT COUNT(*) FROM ETAPE) ; 

6 - Quel est le classement général des coureurs (nom, code équipe,

code pays et temps des coureurs) à l'issue des 13 premières étapes

sachant que les bonifications ont été intégrées dans les temps réalisés

à chaque étape ?

SELECT NomCoureur, CodeEquipe, CodePays, SUM(TempsRéalisé) AS Total 

FROM PARTICIPER A, COUREUR B 

WHERE A.NuméroCoureur=B.NuméroCoureur and NuméroEtape<=13 

GROUP BY A.NuméroCoureur, NomCoureur, CodeEquipe, CodePays 

ORDER BY Total; 

7 - Quel est le classement par équipe à l'issue des 13 premières étapes

(nom et temps des équipes) ?

Page 12: Correction de l

SELECT NomEquipe, SUM(TempsRéalisé) AS Total FROM PARTICIPER A, COUREUR B, EQUIPE C WHERE A.NuméroCoureur=B.NuméroCoureur And B.CodeEquipe=C.CodeEquipe And NuméroEtape<=13 GROUP BY B.CodeEquipe, NomEquipe ORDER BY Total;