Vous êtes sur la page 1sur 4

Exercice : Soit le modèle relationnel suivant :

Secteur (codeSec, nomSec)


Module (numMod, nomMod)
Filiere(numFil, nomFil, codeSec#)
Stagiaire(numStag, nomStag, dateNais, sexe, numFil#)
Notation(numStag#, numMod#, note)
Programme(numFil#, numMod#, coefficient)
Partie 1 :
1. Créer la base de données ainsi que ses tables
2. Le nom du module ne peut pas se répéter, ajouter une contrainte dans ce sens
3. Supprimer la colonne sexe de la table stagiaire sachant qu’elle est liée par une contrainte
ck_sexe
4. Ajouter la colonne date_inscription à la table stagiaire
5. Supprimer la table secteur
6. Saisir les informations suivantes dans la base de données : la filière réseau porte le numéro 2
étudie 2 modules : le module sisco ayant le coef 3 et le module maintenance ayant le coef 2 et
porte le numéro 5
7. Supprimer toutes les filières de secteur industriel
8. Modifier le nom du module numéro 3, en lui affectant le nom Algorithme
9. La note du module ne peut pas être négative, créer une contrainte dans ce sens
10.Recréer le champ sexe et associe lui une contrainte pour qu’il ne prenne que les valeurs F et M
Partie 2 :
1. Afficher la liste des filières (numéro et nom)
2. Afficher la liste des filières du secteur « tertiaire »
3. Afficher la liste des stagiaires de sexe féminin
4. Afficher la liste des stagiaires de sexe masculin
5. Afficher la liste des modules de la filière TDM (numéro et nom du module)
6. Afficher la liste des modules qui entrent dans le programme des filières de secteur industriel
7. Afficher le numéro et le nom des stagiaires qu’on n’a pas encore saisi la note
8. Afficher le numéro et le nom des stagiaires qu’on n’a pas encore saisi la note pour le module
numéro 5
9. Afficher le nombre total de filières
10. Afficher le nombre de module par filière
11. Afficher le nombre de module par filière de secteur « tertiaire »
12. Afficher les filières ayant plus de 10 modules au programme
13. Afficher les stagiaires ayant moins de 20 ans
14. Afficher pour le stagiaire numéro 20 la liste de ses notes (numéro et nom du module, note et
coefficient)
15. Afficher les noms des modules qui sont étudiés dans toutes les filières
16. Afficher les noms des modules qui sont étudiés dans toutes les filières du secteur industriel
17. Afficher les noms des modules qui sont étudiés dans toutes les filières du secteur industriel
et qui ne sont pas étudiés par des filières du secteur tertiaire
18. Afficher la filière qui a le plus de module
19. Afficher le stagiaire qui a la moyenne la plus élevée
20. Afficher la liste des stagiaires triée par moyenne décroissante (numéro, nom, nom de la
filière et la moyenne)
Solution :
create database EFM
use EFM
create table module(numMod int constraint pk_module primary key,
nomMod varchar(30))
create table secteur(codSec varchar(10) constraint pk_secteur
primary key, nomSec varchar(30))
create table filiere(numFil int constraint pk_filiere primary key,
nomFil varchar, codeSec varchar(10) constraint fk_filiere_secteur
foreign key references secteur)
create table stagiaire(numStag int constraint pk_stagiaire primary
key, nomStag varchar(30), sexeStag char(1) constraint ck_sexe
check(sexeStag in ('M','F')), dateNais date, numFil int constraint
fk_numFil foreign key references filiere)
create table notation(numStag int constraint fk_numStag references
stagiaire, numMod int constraint fk_numMod references module, note
real, constraint pk_stagiaire_module primary key(numStag, numMod))
create table programme(numFil int constraint fk_numFilprog foreign
key references filiere, numMod int constraint fk_numModprog foreign
key references module, coef int ,constraint pk_programme primary key
(numFil, numMod))

--q1
select numFil,nomFil from filiere
--q2
select numFil,nomFil from
filiere f inner join secteur s on f.codeSec=s.codeSec
where nomSec='tertiaire'
--q3
select * from stagiaire
where sexeStag='f'

--q4
select * from stagiaire
where sexeStag='m'
--q5
select m.numMod, nomMod from module m inner join programme p on
p.numMod=m.numMod inner join filiere f on f.numFil=p.numFil

where nomfil='tdm'
--q6
select m.numMod, nomMod from module m inner join programme p on
p.numMod=m.numMod inner join filiere f on f.numFil=p.numFil inner
join secteur s on s.codeSec=f.codeSec
where nomSec='industriel'
--q7
select numstag, nomstag from stagiaire s
where not exists (select * from notation n where n.numStag=
s.numStag)

--q8
select numstag, nomstag from stagiaire s
where not exists (select * from notation n inner join module m on
m.numMod=n.numMod where n.numStag= s.numStag and m.numMod=5)
--q9
select count(numfil) as [nombre total de filiere]
from filiere
--10
select f.numFil,nomfil, count(m.nummod)
from module m inner join programme p on p.numMod=m.numMod inner join
filiere f on p.numFil=f.numFil
group by f.numfil, nomFil
--11
select f.numFil,nomfil, count(m.nummod)
from module m inner join programme p on p.numMod=m.numMod inner join
filiere f on p.numFil=f.numFil inner join secteur s on
f.codeSec=s.codeSec
where nomSec='tertiaire'
group by f.numfil, nomFil
--12
select f.numFil, f.nomFil
from filiere f inner join programme p on p.numFil=f.numFil
group by f.numFil, f.nomFil
having count(f.numfil)>2
--13
select nomstag
from stagiaire
where DATEDIFF(year,datenais,getdate())<20
--14
select n.numStag, m.numMod, m.nomMod, n.note, p.coef
from notation n inner join module m on n.numMod=m.numMod inner join
programme p on p.numMod=m.numMod
where n.numStag=20
--15
select m.numMod
from module m
where(select count(p.numMod) from programme p where
m.numMod=p.numMod)=(select count(*) from module)

--méthode 2
select *
from module m
where
not exists
(select *
from filiere f
where not exists (select * from programme p where f.numFil=p.numFil
and m.numMod=p.numMod))

--méthode 3
select m.numMod, m.nomMod
from module m inner join programme p on p.numMod=m.numMod
group by m.numMod, m.nomMod
having count(numFil)=(select count(numFil) from filiere)
--16
select m.nomMod, m.nomMod
from module m inner join programme p on p.numMod=m.numMod inner join
filiere f on p.numFil=f.numFil inner join secteur s on
f.codeSec=s.codeSec
group by m.numMod, m.nomMod
having count(*) = (select count(numfil) from filiere f inner join
secteur s on f.codeSec=s.codeSec and nomSec='industriel')

--17
select m.numMod, m.nomMod
from module m inner join programme p on p.numMod=m.numMod inner join
filiere f on f.numFil=p.numFil inner join secteur s on
s.codeSec=f.codeSec
where s.nomSec='industriel'
and m.numMod not in (select m.numMod from programme p inner join
filiere f on f.numFil=p.numFil inner join secteur s on
s.codeSec=f.codeSec
where s.nomSec='tertiaire' )

--18
select f.numFil,f.nomFil
from filiere f inner join programme p on p.numFil=f.numFil
group by f.numFil,f.nomFil
having count(numMod)>=all(select count(numMod) from programme group
by numFil)
--19
select s.numStag
from stagiaire s inner join notation n on n.numStag=s.numStag inner
join module m on m.numMod=n.numMod inner join programme p on
n.numMod=p.numMod
group by s.numStag
having (sum(note*coef)/sum(coef))>=all(select
sum(note*coef)/sum(coef) from stagiaire s inner join notation n on
n.numStag=s.numStag inner join module m on m.numMod=n.numMod inner
join programme p on n.numMod=p.numMod
group by s.numStag)

Vous aimerez peut-être aussi