I N S T I T U T
S U P E R I E U R
INFORMATIQUE
)@J@@ED'@9D%D J@D'@9D' /@G9E@D'
ISI
Ann e Universitaire 2020-2021
Mast re professionnel en logiciels libres - M1
Bases de donn es Avanc es Activit 4.1
R. ZAAFRANI, 23/11/2020
Correction de l'activit 4.1
1) Sch ma ODL possible pour la base de donn es
Une d cision prendre lors de la d finition est de choisir entre interfaces et classes. Certaines classes peuvent
avoir des extensions. Nous avons choisi dimpl menter les extensions de Voiture, Vin, Appartement, Buveur et
Employ et Personne.
nveh) {
inverse
nss)
{
inverse
inverse
key
key
voitures
string nveh ;
string couleur;
string marque;
short km;
Personne
Appartient
rouler(in short distance);
class Voiture (extent
attribute
attribute
attribute
attribute
relationship
short
} ;
class Personne
attribute
attribute
attribute
attribute
relationship
relationship
short
void
short
} ;
class Employ extends Personne (extent employ s
attribute
attribute
attribute
relationship
relationship
void
Publicité
} ;
(extent personnes
string nss ;
string nom;
string prenom;
date datenaissance;
habite
Appart
Voiture
Poss de
vieillir();
dormir();
age();
inf rieurs
sup rieur
key
nss)
{
salaire;
primes; //attribut multivalu
enum fonct{ing nieur, secr taire, analyste, programmeur} fonction ;
float
list<float>
Set<Employ >
Employ
travailler();
inverse Employ :: sup rieur;
inverse Employ :: inf rieurs;
Personne :: Poss de;
Appart :: loge;
Voiture :: Appartient;
class Buveur extends Personne (extent buveurs
attribute
attribute
relationship
void
} ;
typebuv{petit, moyen, gros} type ;
etabuv{normal, ivre} etat ;
list<Vin>
boire(in Vin v);
inverse
boire
key
nss)
{
vin :: bu_par;
class Appart
attribute
relationship
(extent
Apparts)
{
struct adresse(short etage, unsigned short numero, string rue, unsigned short code, string ville) ;
Set<personne>
loge
Publicité
inverse
Personne::habite;} ;
Bases de donn es Avanc es Activit 4.1
1
class Vin (extent Vins) {
attribute
attribute
attribute
attribute
relationship
string cru;
string millesime;
string degre;
string qualite;
list<Buveur> bu_par
inverse
Buveur ::boire;} ;
Lh ritage multiple n tant pas possible au niveau des classes, les employ s buveurs sont des employ s avec les
propri t s de buveurs r p t es.
class Employ Buveur extends Employ
attribute
attribute
relationship
void
typebuv{petit, moyen, gros} type ;
etabuv{normal, ivre} etat ;
list<Vin>
boire(in Vin v);} ;
inverse
boire
(extent employ s_buveurs) {
vin ::bu_par;
2) OQL :
a. Nous attribuons le nom persistant MAVOITURE lobjet d signant ma voiture. Donnez sa couleur ?
(Q1):
mavoiture.couleur;
b. Donnez le nom de son propri taire ?
(Q2):
mavoiture.appartient.nom;
c. Retrouvez les num ros de s curit sociale des employ s inf rieurs du propri taire de MAVOITURE ?
(Q3):
mavoiture.appartient.inf rieurs.nss;
select
from m in mavoiture.appartient.inf rieurs;
m.nss
d. Retrouvez les noms et les pr noms des grands buveurs ?
(Q4):
SELECT b.nom, b.pr nom
FROM
WHERE
b in buveurs
b.type = 'gros';
e. Retrouvez les noms et les pr noms des employ s grands buveurs ?
(Q5):
SELECT eb.nom, eb.pr nom
FROM
Publicité
WHERE
eb in employ s_buveurs
eb.type = 'gros';
(Q6):
f. Retrouvez les noms et les pr noms des buveurs qui ont bu du Volnay?
SELECT b.nom, b.pr nom
FROM
WHERE
b in buveurs, v in b.boire
v.cru= 'Volnay';
Les collections d pendantes se parcourent par des variables imbriqu es
derri re le FROM.
g. Retrouvez les doublets (nom, ville) pour chaque gros buveur ?
(Q7):
SELECT STRUCT (nom : b.nom, ville:b.habite.adresse.ville)
FROM
WHERE
b in buveurs
b.type = 'gros';
Bases de donn es Avanc es Activit 4.1
2
h. Extraire le nom et le pr nom des employ s buveurs inf rieurs du propri taire de MAVOITURE, ainsi
que la liste de leurs vins bus (cru, mill sime, degr , qualit ).
SELECT STRUCT (
(Q8):
nom:struct(nom_buveur: eb.nom,
prenom_buveur: eb.prenom),
vins:( SELECT STRUCT (cru_vin: v.cru,
mill sime_vin: v.mill sime,
degr _vin: v.degr ,
qualit _vin: v.qualit )
FROM v in eb.boire)
FROM
WHERE
eb in employ s_buveurs
eb.sup rieur = mavoiture.appartient;
i. Retournez le seul objet qui r f rence l'employ ayant le num ro de s curit sociale "77" ?
(Q9): element (SELECT e
FROM e in employ s
WHERE e.nss = '77');
j. Retournez la moyenne ms de tous les salaires des employ s buverurs
ayant pour fonction "analyste".
(Q10): avg (SELECT eb.salaire
FROM eb in employ s_buveurs
WHERE eb.fonction = 'analyste');
k. Donner la liste des identifiants dobjets des voitures de la marque Renault ?
(Q11):
ARRAY( SELECT v
FROM v in voiture
WHERE v.marque = 'renault')
l. Retrouvez le nom, la ville dhabitation et l ge des employ s dont le salaire est sup rieur 10000 et
l ge inf rieur 30 ans ?
(Q12):
SELECT DISTINCT e.nom, e.habite.adresse.ville, e.age()
FROM
WHERE
Publicité
e in employ s
e.salaire > 10000 AND e.age()<30;
m. Extraire les noms et les pr noms de tous les buveurs qui ont bu le vin beaujolais 2019
(Q13): SELECT b.nom, b.pr nom
FROM
b in buveurs
WHERE 'beaujolais 2019' in (select v.cru from v in b.boire);
n. Tous les employ s buveurs ayant pour fonction "programmeur" habitent-ils "Tunis" ?
(Q14): for all eb in
(SELECT eb FROM eb in employ s_buveurs
WHERE eb.fonction = 'programmeur') :
eb.Habite.adresse.ville = 'Tunis' ;
o. Donnez le nom et la liste des inf rieurs de chaque employ qui sont mieux pay s que lui ?
(Q15):
SELECT DISTINCT (nom:e.nom, inf_mieux_pay s :
LIST( SELECT i
FROM
WHERE
i in e.inf rieurs
i.salaire > e.salaire))
FROM e in employ s;
p. Extraire les noms et pr noms des trois mieux pay s employ s buveurs poss dant une voiture de la
marque "Volswagen".
(Q16): (SELECT STRUCT(nom_personne: eb.nom,
prenom_personne:eb.prenom, salaire: eb.salaire)
FROM
WHERE
ORDER BY eb.salaire desc) [0:2] ;
eb in employ s_buveurs
eb.Poss de.marque = ' Volswagen'
Bases de donn es Avanc es Activit 4.1
3
q. Donnez pour chaque ville le salaire moyen des employ s sil est sup rieur 5000 ?
(Q17): SELECT STRUCT(ville, moy:AVG(SELECT p.salaire FROM p in
PARTITION))
e in employ s
FROM
GROUP BY ville:e.habite.adresse.ville
HAVING AVG (SELECT p.salaire FROM p in PARTITION)> 5000;
3)
a)Cr er une vue a_pour_inf rieurs pour extraire l'ensemble des employ s inf rieurs d'un
sup rieur propri taire d'une voiture ayant un num ro donn .
DEFINE
a_pour_inferieurs(nveh) as
SELECT i
FROM e in employ s, i in e.inf rieurs
WHERE e.poss de = nveh;
b) Ecrire une requ te qui retourne le nombre d'inf rieurs ayant comme sup rieur le propri taire
de la voiture num ro "55"
count (a in a_pour_inferieurs ('55'));
Bases de donn es Avanc es Activit 4.1
4