Exercice Corrigés
Exercice Corrigés
Exercice Corrigés
Soit la base de données d’un festival de musique : Dans une représentation peut participer un
ou plusieurs musiciens. Un musicien ne peut participer qu’à une seule représentation.
Representation (Num_Rep , titre_Rep , lieu)
Musicien (Num_mus , nom , #Num_Rep)
Programmer (Date , #Num_Rep , tarif)
1. La liste des titres des représentations.
?
1 SELECT titre_Rep FROM Representation
2. La liste des titres des représentations ayant lieu au « théâtre allissa ».
?
1 SELECT titre_Rep FROM Representation WHERE lieu="theatre␣allissa"
3. La liste des noms des musiciens et des titres et les titres des représentations auxquelles ils
participent.
?
1 SELECT M.nom, R.titre_Rep FROM Musicien M INNER JOIN Representation R ON R.Num_rep=
4. La liste des titres des représentations, les lieux et les tarifs du 25/07/2008.
?
1 SELECT R.titre_Rep, R.lieu,P.tarif FROM Programmer P INNER JOIN Representation R
2 ON P.Num_rep=R.Num_rep WHERE P.date="25-07-2008"
5. Le nombre des musiciens qui participent à la représentations n°20.
?
1 SELECT COUNT (*) FROM Musicien WHERE Num_rep =20
6. Les représentations et leurs dates dont le tarif ne dépasse pas 20DH.
?
1 SELECT R.Num_Rep , R.titre_Rep , P.Date FROM Representation R INNER JOIN Programmer
2 ON R.Num_Rep=P.Num_Rep WHERE P.tarif<=20
Exercice 2
Soit la base de données suivante :
Départements :( DNO, DNOM, DIR, VILLE)
Employés : ( ENO, ENOM, PROF, DATEEMB, SAL, COMM, #DNO)
Exprimez en SQL les requêtes suivantes :
1. Donnez la liste des employés ayant une commission
?
1 SELECT * FROM Employes WHERE COMM NOT NULL
2. Donnez les noms, emplois et salaires des employés par emploi croissant, et pour chaque
emploi, par salaire décroissant
?
1 SELECT ENOM,PROF, SAL FROM Employes ORDER BY PROF ASC, SAL DESC
3. Donnez le salaire moyen des employés
?
1 SELECT AVG(SAL) FROM Employes
4. Donnez le salaire moyen du département Production
?
1 SELECT AVG(E.SAL) FROM Employes E INNER JOIN Departement D
2 ON E.DNO=D.DNO WHERE D.DNOM="production"
5. Donnes les numéros de département et leur salaire maximum
?
1 SELECT DNO, MAX(SAL) FROM Employes GROUP BY DNO
6. Donnez les différentes professions et leur salaire moyen
?
1 SELECT PROF, MAX(SAL) FROM Employes GROUP BY PROF
7. Donnez le salaire moyen par profession le plus bas
?
1 SELECT PROF, AVG(SAL) as moy FROM Employes
2 GROUP BY PROF
3 ORDER BY moy ASC
LIMIT 1
4
8. Donnez le ou les emplois ayant le salaire moyen le plus bas, ainsi que ce salaire moyen
?
1 SELECT PROF FROM Employes GROUP BY PROF
2 HAVING AVG(SAL)=(SELECT AVG(SAL) as moy FROM Employes
3 GROUP BY PROF ORDER BY moy ASC LIMIT 1)
Exercice 3
Soit le modèle relationnel suivant relatif à la gestion des notes annuelles d’une promotion
d’étudiants :
ETUDIANT(NEtudiant, Nom, Prénom)
MATIERE(CodeMat, LibelléMat, CoeffMat)
EVALUER(#NEtudiant, #CodeMat, Date, Note)
Exprimez en SQL les requêtes suivantes :
1. Quel est le nombre total d’étudiants ?
?
1 SELECT count(*) FROM ETUDIANT
2. Quelles sont, parmi l’ensemble des notes, la note la plus haute et la note la plus basse ?
?
1 SELECT MIN(Note) as ’plus basse note’, MAX(Note) as ’plus haute note’ FROM EVALUER
3. Quelles sont les moyennes de chaque étudiant dans chacune des matières ?
?
1 SELECT E.NEtudiant, M.LibelléMat, AVG(EV.Note) AS MoyEtuMat
2 FROM EVALUER EV, MATIERE M, ETUDIANT E WHERE EV.CodeMat = M.CodeMat AND EV.NEtudia
3 GROUP BY E.NEtudiant, M.LibelléMat
4. Quelles sont les moyennes par matière ? Avec la vue MGETU de la question 3
( MOYETUMAT)
?
1 SELECT LibelleMat, AVG(MoyEtuMat) FROM MOYETUMAT GROUP BY LibelleMat
5. Quelle est la moyenne générale de chaque étudiant ? Avec la vue MGETU de la question 3
( MOYETUMAT)
?
1 SELECT NEtudiant, SUM(MoyEtuMat*CoeffMat)/SUM(CoeffMat) AS MgEtu
2 FROM MOYETUMAT GROUP BY NEtudiant
6. Quelle est la moyenne générale de la promotion ? Avec la vue MGETU de la question 5 :
?
1 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? Avec la vue MGETU de la question 5
?
1 SELECT NEtudiant , Nom , Prenom , MgEtu FROM MGETU
2 WHERE MgEtu >= (SELECT AVG(MgEtu) FROM MGETU)
Exercice 4
Soit la base de données intitulée "gestion_projet" permettant de gérer les projets relatifs au
développement de logiciels. Elle est décrite par la représentation textuelle simplifiée
suivante :
Developpeur (NumDev, NomDev, AdrDev, EmailDev, TelDev)
Projet (NumProj, TitreProj, DateDeb, DateFin)
Logiciel (CodLog, NomLog, PrixLog, #NumProj)
Realisation (#NumProj, #NumDev)
Ecrire les requêtes SQL permettant :
1. D’afficher les noms et les prix des logiciels appartenant au projet ayant comme titre «
gestion de stock », triés dans l’ordre décroissant des prix .
?
1 SELECT L.NomLog, L.PrixLog FROM Logiciel L INNER JOIN Projet P
2 ON L.NumProj=P.NumProj WHERE P.TitreProj="gestion␣de␣stock"
3 ORDER BY L.PrixLog DESC
2. D’afficher le total des prix des logiciels du projet numéro 10. Lors de l’affichage, le titre
de la colonne sera « cours total du projet ».
?
1 SELECT SUM(PrixLog) as "cout␣total␣du␣projet" FROM Logiciel WHERE NumPRoj=10
3. Afficher le nombre de développeurs qui ont participé au projet intitulé « gestion de stock »
?
1 SELECT count(*) FROM Developpeur D INNER JOIN Realisation R
2 ON D.NumDev=R.NumDev INNER JOIN Projet P ON P.NumProj=R.NumProj
4. Afficher les projets qui ont plus que 5 logiciels
?
1 SELECT NumProj, TitreProj FROM PRojet P INNER JOIN Logiciel L ON P.NumProj=L.NumPro
2 GROUP BY NumProj, TitreProj
3 HAVING count(*)>5
5. Les numéros et noms des développeurs qui ont participés dans tout les projets.
?
1 SELECT NumDev, NomDev FROM Developpeur D INNER JOIN Realisation R ON D.NumDev=R.Num
2 GROUP BY NumDev, NomDev
3 HAVING count(*)=(SELECT COUNT(*) FROM Projet)
6. Les numéros de projets dans lesquelles tous les développeurs y participent dans sa
réalisation.
?
1 SELECT NumProj, TitreProj FROM Projet P INNER JOIN Realisation R ON P.NumProj=R.Num
2 GROUP BY NumProj, TitreProj
3 HAVING count(*)=(SELECT COUNT(*) FROM Developpeur)
Exercice 5
Ci-après, on donne la représentation textuelle simplifiée d’une base de données concernant un
cycle de formation destiné à des étudiants. Il regroupe un ensemble de matières. On considère
que chaque enseignant n’enseigne qu’une seule matière et qu’à la fin du cycle de formation,
une note par matière, est attribuée à chaque étudiant. D’autre par, les étudiants peuvent ne pas
suivre les mêmes matières.
ETUDIANT(CodeEt, NomEt, DatnEt)
MATIERE(CodeMat, NomMat, CoefMat)
ENSEIGNANT(CodeEns, NomEns, GradeEns, #CodeMat)
NOTE(#CodeEt, #CodeMat, note)
Ecrire les requêtes SQL permettant d’afficher :
1. Les informations relatives aux étudiants (Code, Nom et Date de naissance) selon l’ordre
alphabétique croisant du nom
?
1 SELECT * FROM ETUDIANT ORDER BY NomEt ASC
2. Les noms et les grades des enseignants de la matière dont le nom est ‘BD’.
?
1 SELECT E.NomEns, E.GradeEns FROM ENSEIGNANT E INNER JOIN MATIERE M
2 ON M.CodeMat=E.CodeMat WHERE M.NomMat="BD"
3. La liste distincte formée des noms et les coefficients des différentes matières qui sont
enseignées par des enseignants de grade ‘Grd3’.
?
1 SELECT DISTINCT(M.NomMat), M.CoefMat FROM ENSEIGNANT E INNER JOIN MATIERE M
2 ON M.CodeMat=E.CodeMat WHERE E.GradeEns="Grd3"
4. La liste des matières (Nom et Coefficient) qui sont suivies par l’étudiant de code ‘Et321’.
?
1 SELECT M.NomMat, M.CoefMat FROM MATIERE M INNER JOIN NOTE N
2 ON M.CodeMat=N.CodeMat INNER JOIN ETUDIANT E ON E.CodeEt=N.CodeEt
3 WHERE E.CodeEt="Et321"
5. Le nombre d’enseignants de la matière dont le nom est ‘Informatique’
?
1 SELECT COUNT(*) FROM ENSEIGNANT E INNER JOIN MATIERE M ON M.CodeMat=E.CodeMat
2 WHERE M.NomMat="Informatique"
Exercice 6
On considère la base de données BD_AIR_MAROC suivante :
PILOTE (NUMPIL, NOMPIL, VILLE, SALAIRE)
AVION (NUMAV, NOMAV, CAPACITE, VILLE)
VOL (NUMVOL, #NUMPIL, #NUMAV, VILLE_DEP, VILLE_ARR, H_DEP,
H_ARR)
1. Donnez la liste des avions dont la capacité est supérieure à 350 passagers.
?
1 SELECT * FROM AVION WHERE CAPACITE>350
2. Quels sont les numéros et noms des avions localisés à Marrakech ?
?
1 SELECT NUMAV, NOMAV FROM AVION WHERE VILLE=’Marrakech’
3. Quels sont les numéros des pilotes en service et les villes de départ de leurs vols ?
?
1 SELECT NUMPIL , VILLE_DEP FROM VOL
4. Donnez toutes les informations sur les pilotes de la compagnie.
?
1 SELECT * FROM PILOTE
5. Quel est le nom des pilotes domiciliés à Meknès dont le salaire est supérieur à 20000 DH ?
?
1 SELECT NOMPIL FROM PILOTE WHERE VILLE=’Meknes’ AND SALAIRE>20000
6. Quels sont les avions (numéro et nom) localisés à Marrakech ou dont la capacié est
inférieure à 350 passagers ?
?
1 SELECT NUMAV, NOMAV FROM AVION WHERE VILLE=’Marrakech’ AND CAPACITE< 350
7. Quels sont les numéros des pilotes qui ne sont pas en service ?
?
1 SELECT NUMPIL FROM PILOTE WHERE NUMPIL NOT IN (SELECT DISTINCT NUMPIL FROM VOL)
8. Donnez le numéro des vols effectués au départ de Marrakech par des pilotes de Meknès ?
?
1 SELECT DISTINCT V.NUMVOL FROM VOL AS V, PILOTE AS P
2 WHERE V.NUMPIL=P.NUMPIL AND V.VILLE_DEP=’Marrakech’ AND P.VILLE=’Meknes’
Ou
?
1 SELECT DISTINCT NUMVOL FROM VOL WHERE V.VILLE_DEP=’Marrakech’ AND
2 NUMPIL NOT IN (SELECT NUMPIL FROM PILOTE WHERE VILLE=’Meknes’)
9. Quels sont les vols effectu"s par un avion qui n’est pas localisé à Marrakech ?
?
1 SELECT DISTINCT V.NUMVOL FROM VOL V, AVION A WHERE A.NUMAV=V.NUMAV AND A.VILLE !=’M
10. Quelles sont les villes desservies à partir de la ville d’arrivée d’un vol au départ de
Guelmim ?
?
1 SELECT DISTINCT VILLE_ARR FROM VOL WHERE VILLE_DEP=’Guelmim’ AND VILLE_DEP != VILLE
Exercice 7
Soit le schéma relationnel suivant :
Departement (NomD, N_Dep, Directeur)
Employe (Matricule, Nom, Prénom, DateNaissance, Adresse, Salaire, #N_dep, superieur)
Projet (NomP, N_pro, Lieu, #N_Dep)
Travaille (#Matricule, #N_Proj, Heures)
L’attribut supérieur dans la relation Employe contient le matricule du supérieur direct de
l’employé. Chaque employé appartient à un département et travaille sur zéro, un ou plusieurs
projets. Chaque projet est rattaché à un département qui peut être différent de celui des
employés travaillant sur ce projet.
Exprimer en SQL les requêtes suivantes :
1. Date de naissance et l’adresse de Taha Lamharchi.
?
1 SELECT DateNaissance, Adresse FROM Employe WHERE Nom=’Lamharchi’ AND Prenom =’Taha’
2. Nom et adresse des employés qui travaillent au département de recherche.
?
1 SELECT E.Nom, E.Adresse FROM Employe as E, Departement as D
2 WHERE E.N_dep=D.N_dep AND NomD=’recherche’
3. Nom et Prénom des employés dont le supérieur est Taha Lamharchi.
?
1 SELECT Nom , Prenom FROM Employe
2 WHERE superieur=(SELECT Matricule FROM Employe WHERE Nom=’Lamharchi’ AND Prenom =’T
4. Nom des employés qui travaillent plus de 10heures sur un projet à Guelmim
?
1 SELECT E.Nom FROM Employe as E, Travaille as T , Projet P
2 WHERE E.Matricule=T.Matricule AND T.N_proj=P.N_proj AND T.heures >=10 AND P.Lieu=’G
5. Nom des projets sur lesquelles travaillent Taha Lamharchi et Dounia Mahmoud.
?
1 SELECT T.N_proj FROM Travaille as T,Employe as E WHERE T.Matricule=E.Matricule AND E
2 INTERSECT
3 SELECT T.N_proj FROM Travaille as T,Employe as E WHERE T.Matricule=E.Matricule AND E
6. Nom et prénom des employés qui ne travaillent sur aucun projet.
?
1 SELECT Nom , Prenom FROM Employe
2 WHERE Matricule NOT IN ( SELECT Matricule FROM Travaille)
7. Numéro des projets qui ont au moins un participant de chaque département.
?
1 SELECT T.N_proj FROM Travaille as T,Projet as P, Employe as E
2 WHERE T.N_proj=P.N_proj AND T.Matricule=E.Matricule
3 GROUP BY T.N_proj
HAVING count(DISTINCT E.N_dep)=(SELECT count(*) FROM Departement)
4
8. Nom des employés qui ne travaillent pas sur un projet à Guelmim.
?
1 SELECT Nom FROM Employe
2 WHERE Matricule NOT IN(SELECT T.Matricule FROM Travaille as T, Projet as P WHERE T.N
Exercice 8
Soit le schéma relationnel suivant qui représente la base de données d’une agence de voyage
en ligne.
CLIENT (NumCli, Nom, Prénom, e-mail, NumCB )
VOYAGE (CodeVoyage, Destination, Durée, Prix )
RESERVATION (#NumCli, #CodeVoyage, DateRes )
Formuler en SQL les requêtes suivantes :
1. Nom, prénom et e-mail des clients ayant une réservation en cours
?
1 SELECT Nom, Prenom, e-mail FROM CLIENT
2 WHERE NumCli IN (SELECT DISTINCT NumCli FROM RESERVATION)
2. Nom, prénom et e-mail des clients n’ayant aucune réservation en cours
?
1 SELECT Nom, Prenom, e-mail FROM CLIENT
2 WHERE NumCli NOT IN (SELECT DISTINCT NumCli FROM RESERVATION)
3. Destination et liste des clients ayant réservés pour un voyage de plus de 10 jours et coûtant
moins de 1000 DH.
?
1 SELECT C.Nom, C.Prenom, V.Destination FROM CLIENT as C, VOYAGE as V, RESERVATION as
2 WHERE C.NumCli=R.NumCli and V.CodeVoyage = R.CodeVoyage AND Duree >=10 AND Prix < 1
4. Numéros de tous les clients ayant réservés sur tous les voyages proposés.
?
1 SELECT NumCli FROM RESERVATION
2 GROUP BY NumCli
3 HAVING count(*)=(SELECT count(*) FROM VOYAGE)
Exercice 9
Soit la base de données « cinéma » dont le schéma relationnel est donné ci-dessous :
VILLE (CodePostal, NomVille )
CINEMA (NumCine, NomCine, Adresse, #CodePostal )
SALLE (NumSalle, Capacité, #NumCine )
FILM (NumExploit, Titre, Durée)
PROJECTION (#NumExploit, #NumSalle, NumSemaine, Nbentrees)
Ecrivez les requêtes suivantes en algèbre relationnelle :
1. Titre des films dont la durée est supérieure ou égale à deux heures
?
1 SELECT NumExploit , Titre FROM FILM WHERE Duree >=2
2. Nom des villes abritant un cinéma nommé « RIF »
?
1 SELECT NomVille FROM VILLE
2 WHERE CodePostal IN (SELECT CodePostal FROM CINEMA WHERE NomCine=’RIF’)
3. Nom des cinémas situés à Meknès ou contenant au moins une salle de plus 100 places
?
1 SELECT NomCine FROM CINEMA
2 WHERE CodePostal=(SELECT CodePostal FROM VILLE WHERE NomVille=’Meknes’)
3 OR NumCine IN (SELECT NumCine FROM SALLE WHERE Capacite>=100)
4. Nom, adresse et ville des cinémas dans lesquels on joue le film « Hypnose » la semaine 18
?
1 SELECT C.NomCine , C.Adresse , V.NomVille FROM CINEMA as C, VILLE as V
WHERE C.CodePostal=V.CodePostal AND
2
C.NumCine IN (SELECT S.NumCine FROM SALLE as S, FILM as F, PROJECTION as P WHERE P.N
3 F.Titre=’Hypnose’ AND P.NumSemaine=18)
5. Numéro d’exploitation des films projetés dans toutes les salles
?
1 SELECT NumExploit FROM PROJECTION
2 GROUP BY NumExploit
3 HAVING count(*)=(SELECT count(*) FROM SALLE)
6. Titre des films qui n’ont pas été projetés
?
1 SELECT Titre FROM FILM WHERE NumExploit NOT IN (SELECT NumExploit FROM PROJECTION)
Exercice 10
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, LibelleType)
ETAPE(NuméroEtap, DateEtape, VilleDép, VilleArr, NbKm, #CodeType
PARTICIPER(#NuméroCoureur, #NuméroEtape, TempsRealisé)
ATTRIBUER_BONIFICATION(#NuméroEtape, #NuméroCoureur, km, Rang,
NbSecondes)
Exprimez en SQL les requetes suivantes
1. Quelle est la composition de l’équipe Festina (Numéro, nom et pays des coureurs) ?
?
1 SELECT NumeroCoureur , NomCoureur , NomPays FROM EQUIPE A, COUREUR B, PAYS C
2 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 ?
?
1 SELECT SUM(Nbkm) FROM ETAPE
3. Quel est le nombre de kilomètres total des étapes de type "Haute Montagne" ?
?
1 SELECT SUM(Nbkm) FROM ETAPE A, TYPE_ETAPE B
2 WHERE A.CodeType=B.CodeType And LibelleType="HAUTE MONTAGNE"
4. Quels sont les noms des coureurs qui n’ont pas obtenu de bonifications ?
?
1 SELECT NomCoureur FROM COUREUR
2 WHERE NumeroCoureur NOT IN (SELECT NumeroCoureur FROM ATTRIBUER_BONIFICATION)
5. Quels sont les noms des coureurs qui ont participé à toutes les étapes ?
?
1 SELECT NomCoureur FROM PARTICIPER A, COUREUR B WHERE A.NumeroCoureur=B.NumeroCoure
2 GROUP BY NomCoureur
3 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 ?
?
1 SELECT NomCoureur , CodeEquipe , CodePays , SUM(TempsRealise) AS Total
2 FROM PARTICIPER A, COUREUR B
3 WHERE A.NumeroCoureur=B.NumeroCoureur and NumeroEtape <=13
GROUP BY NomCoureur , CodeEquipe , CodePays ORDER BY Total
4
7. Quel est le classement par équipe à l’issue des 13 premières étapes (nom et temps des
équipes) ?
?
1 SELECT NomEquipe , SUM(TempsRealise) AS Total
2 FROM PARTICIPER A, COUREUR B, EQUIPE C
3 WHERE A.NumeroCoureur=B.NumeroCoureur And B.CodeEquipe=C.CodeEquipe And NumeroEta
4 GROUP BY NomEquipe
ORDER BY Total
5
Exercice 11 : Extrait HEC 2014
A partir du système d’information de l’entreprise. le service des ressources humaines peut
extraire et analyser les infor- mations relatives à tous les personnels. celui-ci lui permet en
particulier d’exercer un suivi dans le domaine de la formation. un extrait de ce domaine est
présenté sours forme d’un schéma relation :
Construire les requêtes en langage SQL permettant de répondre aux questions suivantes :
1. Quel est le nombre de formations suivies par catégories de salariés ayant débuté au cours
de la période du 01/06/2011 au 31/12/2011 ?
?
1 SELECT Libellecategorie , count(distinct Codeform) FROM SUIVRE , SALARIE , CATEGOR
2 WHERE SUIVRE.Matriculesal=SALARIE.Matriculesal AND SALARIE.codecategorie=CATEGORIE
3 AND Datedebut BETWEEN "01/06/2011" AND "31/12/2011"
GROUP BY Libellecategorie
4
2. Quelles sont les catégories pour lesquelles le nombre d’heures de formation est supérieur à
la moyenne du nombre d’heures des formations suivies par l’ensemble des personnels ?
?
1 SELECT Libellecategorie FROM SUIVRE , SALARIE , CATEGORIE , FORMATION
2 WHERE SUIVRE.Matriculesal=SALARIE.Matriculesal AND SALARIE.codecategorie=CATEGORIE
3 AND FORMATION.Codeform=SUIVRE.Codeform
4 GROUP BY Libellecategorie
HAVING SUM(Dureeform) > (SELECT AVG(Dureeform) SUIVRE, FORMATION WHERE SUIVRE.Code
5
3. le responsable des ressources humaines souhaite intégrer dans la base de données une
nouvelle formation liée au sertissage des boîtes de conserve.
Les nouvelles données à insérer sont les suivantes : "FORM587, sertissage niveau 1, 25j,
perfectionnement, 12, 525 " Ecrire la requête permettant de mettre à jour la base.
?
1 INSERT INTO FORMATION VALUES("FORM587","sertissage␣niveau␣1",600, "perfectionneme
Exercice 12
La société X utilise le logiciel de gestion de base de données Access pour gérer ses clients et
ses représentants. Voici la liste des tables crées dans Access :