I N S T I T U T S U P E R I E U R INFORMATIQUE ةـيــملاـعلإل يـلاـعلا دـهعمـلا
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 d’implé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 } ;
(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
Publicité
Apparts)
{
struct adresse(short etage, unsigned short numero, string rue, unsigned short code, string ville) ;
Set<personne>
loge
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;} ;
L’hé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 à l’objet 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 ?
Publicité
(Q5):
SELECT eb.nom, eb.prénom FROM 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 d’objets des voitures de la marque « Renault » ?
(Q11):
ARRAY( SELECT v
FROM v in voiture WHERE v.marque = 'renault')
l. Retrouvez le nom, la ville d’habitation 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 s’il 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