Correction de l'activité 4.1 - Bases de données Avancées

Page 1 sur 4Lecteur de document UniversityLib

Correction de l'activité 4.1 - Bases de données Avancées

Database Design and Querying · lab

Voir tous les documents en bases de données

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