Partiel du 29 novembre 2005 2 heures
Documents autorisés.
Les calculatrices, baladeurs et autres appareils électroniques sont interdits. Les téléphones mobiles doivent être eteints et rangés dans les sacs. Le barème sur 20 points (15 questions) n’a qu’une valeur indicative.
, fournisseur, prix_achat, prix_vente) Stock (num_prod, num_mag, quantite)
Vente (num_prod, num_mag, mois, quantite)
Question 1 (1 point)
Définir un schéma entités/associations (E/A) représentant ce schéma.
Solution:
num_prod fournisseur
Produit Magasin
num_mag
stock vente
mois quantite
0,n 0,n
quantite prix_achat
prix_vente
1,n 1,n
Question 2 (3 points)
Modifier et étendre le schema E/A précédent afin de tenir compte des faits suivants : – Un magasin est situé dans une ville, a un certain nombre d’employés et une taille en m2.
– Un fournisseur est identifié par son nom. Il est localisé dans une rue d’une ville et a un numéro de téléphone.
– Un transporteur est identifié par son nom. Il est localisé dans une rue d’une ville et a un numéro de téléphone. Un transporteur possède un certain nombre de camions.
– Un même produit peut etre fourni par plusieurs fournisseurs, le prix d’achat du produit dépend donc du fournisseur qui le fournit.
– Le prix de transport unitaire d’un produit dépend du transporteur mais aussi de la géographie puisqu’il faut transporter les produits du fournisseur jusqu’au magasin.
– Enfin, les produits peuvent être en promotion certains mois. Pendant ce ou ces mois, un pourcentage de réduction est appliqué au produit dans tous les magasins.
Solution:
Entreprise nom
no_tel
rue
ville
Transporteur nb_camions
fournit prix_achat
Produit
Promotion mois
pourc
transporte prix_transport
surface nb_emp
ville Magasin
no_mag no_prod
Les associations vente et stock ne sont pas modifiées.
est_un est_un
Fournisseur
NB : on a ainsi de l’héritage (entreprise se spécialise en fournisseur et transporteur), une association quaternaire pour le prix de transport, une entité faible pour les promotion avec mois pour identificateur partiel)
Question 3 (2 points)
Déduire du schéma E/A précédent le schéma relationnel de la nouvelle base de données de la chaîne d’hypermarché. Souligner pour chaque relation le ou les attributs de la clé primaire.
Solution:
Entreprise(NOM, ville, rue, tel) Transporteur(NOM, nb_camions)
Magasin(NUM_MAG, taille, ville, nb_employés) Produit(NUM_PROD, prix_vente)
Stock(NUM_PROD, NUM_MAG, quantite)
Vente(NUM_PROD, NUM_MAG, MOIS, quantite) Achat(NUM_PROD, NOM_FOUR, prix_achat)
Transport(NUM_PROD, NOM_FOUR, NOM_TRANSP, NUM_MAG, prix_unitaire_transp)
Promo(NUM_PRODUIT, MOIS, %reduc)
2 Langages de requêtes (8 points)
Soit un schéma relationnel qui permet de gérer les données d’une chaîne d’hypermarchés (attention, le schéma est légèrement différent de celui de la première page) :
Produit (num_prod, nom_prod, prix_vente) Stock (num_prod, num_mag, mois, quantite)
Livraison (num_prod, num_f our, num_mag, mois, quantite, prix_achat) Vente (num_prod, num_mag, mois, quantite)
Magasin (num_mag, nom_mag)
Chaque produit est identifié par un numéro et peut être fourni par différents fournisseurs à différents prix. On suppose que la base de données stocke les informations des douze derniers mois. Les mois sont représentés sous forme d’entiers dans l’intervalle [1,12]. Exprimer (quand c’est possible) les requêtes suivantes dans les langages indiqués.
Question 4 (1 point)
Les numéros de produits dont le prix de vente est compris entre 100 Euros et 150 Euros. algèbre et SQL Solution:
πnum_prod(σprix_vente>=100∧prix_vente<=150(P roduit)) select num_prod
from Produit
where prix_vente >= 100 and prix_vente <= 150 Question 5 (1 point)
Les numéros de fournisseurs de produits vendus pendant le mois d’août. algèbre et SQL Solution:
πnum_f our(Livraison1Livraison.num_prod=V ente.num_prod (σmois=8V ente)) select distinct num_four
from Livraison, Vente
where Livraison.num_prod = Vente.num_prod and Vente.mois = 8
Question 6 (1 point)
Les numéros de fournisseurs de produits qui n’ont pas été vendus pendant le mois d’août (on suppose qu’un produit non vendu n’apparaît pas dans la table Vente). algèbre et SQL
Solution:
πnum_f our(Livraison1(πnum_prod(Livraison)−πnum_prod(σmois=8V ente))) select distinct num_four
from Livraison
where num_prod not in (select num_prod from Vente where mois = 8) Question 7 (1 point)
Les numéros de produits disponibles en stock dans tous les magasins au mois d’août. algèbre et SQL Solution: Division :
πnum_prod,num_mag(σmois=8∧quantite>0Stock)÷πnummagM agasin select num_prod
from Produit P and not exists
(select * from Magasin M and not exists
(select * from Stock S
where mois = 8 and quant > 0 and P.num_prod = S.num_prod and M.num_mag = S.num_mag))
Toutes les solutions où la requête extérieure fait le test pour tous les produits sont correctes. Par exemple :
select num_prod from Stock S where not exists
(select * from Magasin M and not exists
(select * from Stock S
where mois = 8 and quantite > 0 and P.num_prod = S.num_prod and M.num_mag = S.num_mag)) Question 8 (1 point)
Les noms des produits livrés par au moins deux fournisseurs différents. calcul n-uplet et SQL Solution:
select nom_prod
from Produit P, Livraison F1, Livraison F2 where F1.num_prod = P.num_prod
and F2.num_prod = P.num_prod and F1.num_four <> F2.num_four
{P.nom_prod | ∃F1, F2(P roduit(P)∧Livraison(F1)∧Livraison(F2)
∧F1.num_prod=P.num_prod∧F2.num_prod=P.num_prod
∧F1.num_f our <> F2.num_f our)}
Question 9 (1 point)
Pour chaque magasin et chaque produit, on affiche le numéro du magasin, le numéro du produit et la quantité totale du produit livrée au magasin entre le mois de janvier et le mois de mars. SQL
Solution:
select num_mag, num_prod, sum(quantite) from Livraison
where mois>=1 and mois <=3 group by num_mag, num_prod Question 10 (1 point)
Les noms des produits les plus chers (prix de vente). SQL Solution:
select nom_prod from Produit PC
where not exists (select *
from Produit P2
where PC.prix_vente < P2.prix_vente) ou
select nom_prod from Produit
where prix_vente >= (select max(prix_vente) from Produit);
Question 11 (1 point)
Pour chaque produit, on affiche son nom et le numéro du magasin qui en a vendu le plus entre le mois de janvier et le mois de juin. SQL
Solution:
select nom_prod, num_mag from Produit P, Vente VM
where P.num_prod = V.num_prod and mois>=1 and mois<=6
group by nom_prod, num_mag
having sum(quantite) >= all (select sum(quantite) from Vente V2
where mois>=1 and mois<=6
and VM.num_prod = V2.num_prod group by num_mag)
3 Création de tables, contraintes et triggers (6 points)
3.1 Create table
On reprend le schéma relationnel de la deuxième section Produit (num_prod, nom_prod, prix_vente)
Stock (num_prod, num_mag, mois, quantite)
Livraison (num_prod, num_f our, num_mag, mois, quantite, prix_achat) Vente (num_prod, num_mag, mois, quantite)
Magasin (num_mag, nom_mag) et on suppose que
– les identificateursnum_prod,num_four,num_magsont des entiers de petite taille,
– les prix sont des rééls positifs inférieurs à 20 000 euros et exprimés en euros et centimes d’euros, – le nom d’un produit ou d’un magasin est une chaîne de taille variable de 64 caractères,
– la quantité est un entier positif,
– le mois est une valeur dans l’intervalle [1,12]
Question 12 (2 points)
Donnez les instructionsCREATE TABLEqui créent les schémas de relation pour les tablesP roduitet Stock avec les contraintes de clés, de clés étrangères et de domaine.
Solution:
CREATE TABLE Produit (
num_prod SMALLINT PRIMARY KEY, nom_four VARCHAR(64),
prix_vente DECIMAL(7,2),
CHECK (prix_vente >= 0 AND prix_vente <= 20000);
CREATE TABLE Stock (
num_prod SMALLINT, num_mag SMALLINT, mois SMALLINT, quantite INT,
PRIMARY KEY (num_prod, num_mag, mois), FOREIGN KEY (num_mag) REFERENCES Magasin, FOREIGN KEY (num_prod) REFERENCES Produit,
CHECK (quantite >= 0 AND mois <= 12 AND mois >= 1));
3.2 Contraintes et triggers
On veut ajouter la contrainte StockCoherentqui vérifie pour chaque magasina, produitpet moism, que le stock du moism correspond à la somme du stock du mois précédentm−1et des livraisons du moism, moins les ventes du moism.
Donner le type de la contrainte et les tables qui sont impliquées dans sa vérification.
Solution: C’est une contrainte globale (assertion) sur les relations Stock, Vente et Livraison.
Question 14 (1 point)
Exprimez la contrainte StockCoherent comme formule de la logique du premier ordre. On suppose qu’il existe une table binaire M pred(mp, m) qui stocke pour chaque moism le mois précédentmp : (12,1)et(3,4)sont des n-uplets dans cette table.
Solution:
∀p, x, m, mp, f, q1, q2, q3, q4( (Stock(p, x, m, q1)∧Stock(p, x, mp, q2)∧ Livraison(p, f, x, m, q3)∧V ente(p, x, m, q4)∧ M pred(mp, m))→q1 =q2 +q3−q4)
ou
∀s1, s2, l, v, m( (Stock(s1)∧Stock(s2)∧ Livraison(l)∧V ente(v)∧ M pred(m)∧
s1.num_prod=s2.num_prod∧
s2.num_prod=v.num_prod∧s2.num_prod=l.num_prod∧ s1.num_mag =s2.num_mag∧s2.num_mag=v.num_mag∧ s2.num_mag =l.num_mag∧
s1.mois=v.mois∧s.mois=l.mois∧ m.mois=s1.mois∧m.mois_prec=s2.mois
→s1.quantite=s2.quantite+l.quantite−v.quantite)
Question 15 (2 points)
Créer un trigger avec la commande CREATE TRIGGER qui augmente après chaque insertion d’un n- uplet dans la table Livraison le stock du même mois d’une manière cohérente (on suppose que pour chaque produit et chaque mois il existe déjà un n-uplet dans la table Stock au moment de la livraison).
Solution:
CREATE TRIGGER StockCoherent AFTER INSERT INTO Livraison FOR EACH ROW
BEGIN
UPDATE Stock SET quantite := quantite + :NEW.quantite WHERE num_prod = :NEW.num_prod
AND num_mag = :NEW.num_mag AND mois = :NEW.mois
END