Vous êtes sur la page 1sur 3

Cours : BDD avancées Département d’Informatique

Promo : RSD_GL (2020/2021) Responsable : a.HALFAOUI

Examen final (Durée 1h30)

Remarques : La note du Contrôle : Note de l’examen


Document autorisé : Momento commandes Mongodb (rien ne doit être écrit sur le doc)
Aucun autre document n’est autorisé

Exercice 1 : Temps estimé (45 mn à 50 mn ) barème : 11.5 pts (-0.25 sur chaque erreur, rajout ou syntaxe
incorrecte)
Soit le schéma SQL3 d’une base de données RO qui gère l’ensemble des auto-écoles. Donnez les requêtes
suivantes :

1. Créer les tables Personnes et AutoEcoles. 1 pt


On suppose que la table Personnes contient les personnes : (1, ‘Sahi’, ‘Redaoune’,39,’M’), (2, ‘Diab’
,’Zohir’,18,’M’) et (3, ‘Chibani’, ‘Djamila’,31,’F’).
0.25
CREATE TABLE Personnes OF Personne;
0.25
CREATE TABLE AUTOECOLES OF AUTOECOLE
NESTED TABLE VOITURES STORE AS V , NESTED TABLE MONITEURS STORE AS M;
0.25 0.25
2. Insérer l’auto-école Amane situé à Kifane , qui contient le moniteur ‘Sahi’ (qui est aussi responsable) et la
monitrice ‘Chibani’. Mettre les autres champs à NULL. 1,5 pt

insert into AUTOECOLES values ('Amane', 'kifane',


(select ref(r) from Personnes r where num=1') , NULL, 0.5 pt
EnsMoniteurs((select ref(c) from lespersonnes c where num=1),
0.5 pt
(select ref(c) from lespersonnes c where num=2))) 0.5 pt

3. Ajouter la voiture '1234-119-13', modèle ‘Peugeot’ année ‘2019’ pour auto-école ’Amane’ . 1.5 pt

update lesautoecole
set voitures = EnsVoitures(Voiture('138653-119-13', 'peugeot', 2019))
where NomAuto = 'Amane'

Deuxième solution
update lesautoecole
set voitures = EnsVoitures() ;
insert into table (select voiture from AutoEcoles where NomAuto = ‘Amane’)
V values ('138653-119-13', 'peugeot', 2019)

4. Supprimer la personne ‘Sahi’ de l’auto-école Amane 2 pt

Delete fom table (select moniteurs from AutoEcoles where NomAuto =


‘Amane’) t where t.column_value.num=1 1 pt
Update autoecoles set responsable = null where NomAuto = ‘Amane’ 1 pt

5. Donner le nom des auto-écoles qui ont une monitrice et qui possèdent plus d’une voiture 2 pt

select e.NomAuto
from lesautoecoles e , table(e.voitures) v, table(e.moniteurs) m
where m.Column_Value.sexe = 'F'
group by e.NomAuto
having count(v.matricule) > 1
6. Soit la base relationnelle qui gère les dossiers des candidats et leurs examens 3.5 pt
Dossier (NumD, NomCandidat, EtapePermis ) EtapePermis = ‘Code’ ou ‘Créneau’ ou ‘Circuit’. Valeur par
défaut est Code
Examen (NumD*,TypeExm, DateExm, Résultat ) Résultat = ‘Obtenu’ ou ‘Recalé’,
TypeExm prend les mêmes valeurs que EtapePermis
- Donnez le déclencheur qui permet de satisfaire la contrainte suivante: A chaque fois qu’un candidat
obtient un examen, le champ EtapePermis prend la valeur de la prochaine étape. Exp : EtapePermis =
Code et le candidat a obtenu l’examen de Type Code donc EtapePermis = ‘Créneau’

Create or replace trigger T (-0.5 sur chaque erreur, ajout ou syntaxe erronée)
After insert or update of Resultat on Examen
When (:new.resultat = ‘Obtenu’)
For each row
Begin
If :new.TypeExm= ‘Code’ then
Update Dossier set EtapePermis = ‘Créneau’ where NumD= :new.NumD ;
End if ;
If :new.TypeExm= ‘Creneau’ then
Update Dossier set EtapePermis = ‘Circuit’ where NumD= :new.NumD ;
End if ;
End ;
Exercice 2 : Temps estimé ( 35 à 40 mn) barème : 8.5 pts (-0.25 sur chaque erreur, rajout ou syntaxe
incorrecte)
Soit la base Mongodb qui gère l’ensemble des auto-écoles (Dossiers des candidats et leurs examens). Donner les
requêtes qui permettent de :
1. Afficher les candidats qui sont à l’étape de Créneau 1 pt

db.DossiersAuto.find({"EtapePermis":"Créneau"},{"Candidat":1,_id:0})
0.5 pt 0.25 pt 0.25 pt
2. Quelle sont les auto-écoles qui ouvrent toute la semaine (le tableau ne contient pas de doublon) 1 pt

db.AutoEcole.find({JoursOuverture:{$size:7}},{NomAuto:1, _id:0})
Solution avec $ALL acceptée
3. La candidate Karoun Sihem a obtenu son code (1er Elément du tableau Examens), et elle passe à l’étape
créneau. Faites les modifications nécessaires. 1.5 pt
0.25 pt 0.25 pt
db. DossiersAuto.update({ "Candidat" : "Karoun Sihem"},
{$set:{"Examens.0.Resulat" : "Obtenu", "EtapePermis" : "Créneau"}})
0.25 pt 0.25 pt 0.25 pt 0.25 pt
4. Donner pour chaque auto-école un tableau de ses candidats, sauvegarder le résultat dans une collection
nommée CandidatsAuto. 2pts
0.25 pt 0.25 pt 0.25 pt 0.25 pt 0.25 pt
db.DossiersAuto.aggregate([{$group:{_id:"$AutoEcole",Candidats:{$push:"$Ca
0.25 pt
ndidat"}}},{$out:"CandidatsAuto"}])
0.25 pt 0.25 pt
1. Donnez la sémantique avec résultat de la requête suivante : 1.5 pt
db.DossiersAuto.aggregate([{$unwind:"$Examens"},{$group:{_id:{resultat:"$Ex
amens.Resultat",Candidat:"$Candidat"},Nombre:{$sum:1}}},
{$match:{Nombre:{$gt:1}}}])
Sémantique : Les candidats qui ont obtenu ou ont été recalés plus d’une
fois Une sémantique et non l’explication des opérateurs !!
Résultat :candidat Diab Zoheir, recalé 2 fois
{
"_id" : {
"resultat" : "Recalé",
"Candidat" : "Diab Zohir"
},
"Nombre" : 2.0
}

2. Donner le résultat (aperçu d’un document affiché) de cette requête 1.5 pts
db.AutoEcole.aggregate(
[{$project:{NomAuto:1,Responsable:1,_id:0}},
{$lookup:
{ from: "DossiersAuto",
localField: "NomAuto",
foreignField: "AutoEcole",
as: "Dossiers"}},
{$unset:["Dossiers.AutoEcole","Dossiers.Examens","Dossiers._id"]}])

Résultat
Document 1
{
"NomAuto" : "ElMansourah",
"Responsable" : "Chibani Djamila",
"Dossiers" : [
{ "NumDossier" : 30,
"Candidat" : "Diab Zohir",
"EtapePermis" : "Créneau"
}
]
}

Document 2
{
"NomAuto" : "Amane",
"Responsable" : "Sahi Redouane",
"Dossiers" : [
{
"NumDossier" : 154,
"Candidat" : "Bensaid Fayssel",
"EtapePermis" : "Créneau"
},
{
"NumDossier" : 155,
"Candidat" : "Karoun Sihem",
"EtapePermis" : "Créneau"
}
]
}

Vous aimerez peut-être aussi