DIFT 3030 Bases de données Correction Travail pratique #1 Partir I

Transcription

DIFT 3030 Bases de données Correction Travail pratique #1 Partir I
DIFT 3030 Bases de données
Correction Travail pratique #1
Partir I : LDD
Q1 :
Construction du schéma de la base e-commerce
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
Article CASCADE CONSTRAINTS;
Client CASCADE CONSTRAINTS;
Commande CASCADE CONSTRAINTS;
LigneDeCommande CASCADE CONSTRAINTS;
Facture CASCADE CONSTRAINTS;
Paiement CASCADE CONSTRAINTS;
CREATE TABLE Article (codeA number,
designation varchar2(60) NOT NULL,
marque varchar2(30) NOT NULL,
prixUnitaire decimal(10,2),
quantiteDispo number,
CONSTRAINT pk_article PRIMARY KEY(codeA),
CONSTRAINT ck_design_marque UNIQUE (designation,
marque)
);
CREATE TABLE Client
(login varchar2(20),
password varchar2(20) NOT NULL,
nom varchar2(20) NOT NULL,
courriel varchar2(50) NOT NULL,
nombreConn number,
adresse varchar2(50) NOT NULL,
CONSTRAINT pk_client PRIMARY KEY(login),
CONSTRAINT ck_nom_adresse UNIQUE (nom, adresse),
CONSTRAINT ck_courriel UNIQUE (courriel)
);
CREATE TABLE Commande
(codeC number,
login varchar2(20),
dateC date DEFAULT sysdate,
CONSTRAINT pk_commande PRIMARY KEY(codeC),
CONSTRAINT
fk_commande_client FOREIGN KEY (login) REFERENCES
Client (login) ON DELETE CASCADE
);
CREATE TABLE LigneDeCommande
(codeC number,
codeA number,
quantite number NOT NULL,
CONSTRAINT quantite CHECK(quantite < 100),
CONSTRAINT pk_ligneDeCommande PRIMARY
KEY(codeC, codeA),
CONSTRAINT fk_ligneDeCommande_commande FOREIGN
KEY (codeC) REFERENCES COMMANDE (codeC) ON DELETE
CASCADE,
CONSTRAINT fk_ligneDeCommande_article FOREIGN KEY
(codeA) REFERENCES ARTICLE (codeA) ON DELETE
CASCADE
);
CREATE TABLE Facture
(codeF number,
codeC number,
dateF date DEFAULT sysdate,
montant decimal(10,2) NOT NULL,
CONSTRAINT check_Facture CHECK (dateF < '10-feb-2005'),
CONSTRAINT pk_facture PRIMARY KEY(codeF),
CONSTRAINT fk_facture_commande FOREIGN KEY (codeC)
REFERENCES Commande (codeC) ON DELETE CASCADE
);
CREATE TABLE Paiement
(codeP number,
codeF number,
dateP date DEFAULT sysdate,
montant decimal(10,2) NOT NULL,
CONSTRAINT pk_paiement PRIMARY KEY(codeP),
CONSTRAINT fk_paiement_commande FOREIGN KEY
(codeF) REFERENCES Facture (codeF) ON DELETE CASCADE
);
Q2 : Insertion de données dans la base
INSERT INTO ARTICLE VALUES (100, 'Intel Pentium 4 2.8GHz Computer',
'HP pavilion', 699.95, 12);
INSERT INTO ARTICLE VALUES (101, 'AMD Athlon 64 3000+ 1.8GHz
Notebook', 'Compaq Presario', 1599.99, 3);
INSERT INTO ARTICLE VALUES (102, 'DSC-P73 4.1MP Digital Camera',
'Sony Cybershot', 299.99, 30);
INSERT INTO ARTICLE VALUES (103, 'PV-GS9 Digital Palmcorder
Camcorder', 'Panasonic', 499.95, 13);
INSERT INTO ARTICLE VALUES (104, '1GB JumpDrive Secure USB 2.0
Drive', 'Lexar', 79, 600);
INSERT INTO ARTICLE VALUES (105, '1GB iPod Shuffle', 'Apple', 199.99,
0);
INSERT INTO ARTICLE VALUES (106, '500-Watt Dolby Digital Receiver,
6-Speaker System', 'Yamaha', 900, 19);
INSERT INTO CLIENT VALUES ('bondj', 'jamesB', 'James bond',
'[email protected]', 3, '1030 rue belle aventure, Montréal, Canada');
INSERT INTO CLIENT VALUES ('breutoniereh', 'heleneR', 'Helene
Bretoniere', '[email protected]', 10, '56 rue de l’église, paris, France');
INSERT INTO CLIENT VALUES ('skywalkerl', 'lucs', 'Luc Skywalker',
'[email protected]', 45, '2334 édouart montpeti, Montréal');
INSERT INTO CLIENT VALUES ('pliskenz', 'zakep', 'Zake Plisken',
'[email protected]', 34, '345 Ciccarili plaza, Milano, Italy');
INSERT INTO CLIENT VALUES ('neoa', 'andersonn', 'Neo Anderson',
'[email protected]', 7, '987 Mandela Street, Calgary, Canada');
INSERT INTO COMMANDE VALUES (1, 'bondj', to_date('20-03-2004', 'dd-mmyyyy'));
INSERT INTO COMMANDE VALUES (2, 'pliskenz', to_date('13-12-2004', 'dd-mmyyyy'));
INSERT INTO COMMANDE VALUES (3, 'neoa', to_date('13-12-2004', 'dd-mmyyyy'));
INSERT INTO COMMANDE VALUES (4, 'neoa', to_date('24-12-2004', 'dd-mmyyyy'));
INSERT INTO COMMANDE VALUES (5, 'bondj', to_date('30-01-2005', 'dd-mmyyyy'));
INSERT INTO COMMANDE VALUES (6, 'neoa', to_date('31-01-2005', 'dd-mmyyyy'));
INSERT INTO LigneDeCommande VALUES (1, 100, 1);
INSERT INTO LigneDeCommande VALUES (2, 106, 1);
INSERT INTO LigneDeCommande VALUES (5, 104, 2);
INSERT INTO LigneDeCommande VALUES (3, 105, 7);
INSERT INTO LigneDeCommande VALUES (3, 102, 1);
INSERT INTO LigneDeCommande VALUES (4, 100, 1);
INSERT INTO LigneDeCommande VALUES (6, 104, 1);
INSERT INTO FACTURE VALUES (100, 1, to_date('21-03-2004', 'dd-mm-yyyy'),
699.95);
INSERT INTO FACTURE VALUES (101, 2, to_date('13-12-2004', 'dd-mm-yyyy'),
900);
INSERT INTO FACTURE VALUES (102, 5, to_date('01-02-2005', 'dd-mm-yyyy'),
158);
INSERT INTO FACTURE VALUES (103, 3, to_date('13-12-2004', 'dd-mm-yyyy'),
1699.92);
INSERT INTO FACTURE VALUES (104, 4, to_date('24-12-2004', 'dd-mm-yyyy'),
699.95);
INSERT INTO FACTURE VALUES (106, 6, to_date('01-02-2005', 'dd-mm-yyyy'),
900);
INSERT INTO PAIEMENT VALUES (100, 100, to_date('10-04-2004', 'dd-mmyyyy'), 699.95);
INSERT INTO PAIEMENT VALUES (102, 103, to_date('13-12-2004', 'dd-mmyyyy'), 1699.92);
INSERT INTO PAIEMENT VALUES (103, 104, to_date('26-12-2004', 'dd-mmyyyy'), 699.95);
Q3 : Ajout de la colonne age avec contrainte
ALTER TABLE CLIENT
ADD ( age number CHECK (age BETWEEN 18 AND 120));
Q4 : Modification de la quantité d'article
UPDATE ARTICLE
SET quantiteDispo = quantiteDispo + 3
WHERE codeA = 105;
Q5 : Supprimer la commande ‘6’
DELETE
FROM COMMANDE
WHERE codeC = 6;
Partir II : Algèbre relationnelle
Q1 : Numéros des articles commandés par l’utilisateur ‘neoa’ et qui ne sont plus en
stock actuellement.
(π [codeA](Ligne_de_Commande ∗ σ [login=`neoa']Commande) )∩ (π [codeA]
σ [quantiteDispo=0] Article)
Q2 : Numéros de commandes dont le paiement est intervenu après le premier janvier
2004.
π [codeC] ((π [codeF] σ [dateP > `01-jan-2004'] Paiement) *
Facture )
Q3 : Prix des articles qui ne figurent dans aucune commande.
π [prixUnitaire]( (π [codeA] Article - π [codeA] LigneDeCommande) * Article)
Q4 : Logins des clients qui ont acheté, éventuellement dans plusieurs commandes, au
moins un exemplaire de tous les articles de moins de 300$.
(π [login, codeA] (Commande * LigneDeCommande)) / π [codeA] σ
[prixUnitaire<300]Article)
Q5 : Noms des clients qui ont acheté uniquement des articles de plus de 500 $.
π [nom] ((π [login] Commande - π [login] (Commande * LigneDeCommande * π
[codeA] σ [prixUnitaire<=500]Article)) * Client )