Vous êtes sur la page 1sur 7

Corrig TD SGBD

/*
Proposition de corrig du TD SGBD
AU : 2014-2015
*/
/* **************************************************************************
PARTI I: Cration des tables
************************************************************************** */
------------------------------------------------------------------------------ 1. Crer la base de donnes et ses tables.
----------------------------------------------------------------------------create database Delizioso
use Delizioso
/*
Il faut faire attention l'ordre de cration des tables
( cause des FK)
*/

CREATE TABLE Serveur


(
id_serv integer
Constraint PK_Serveur Primary Key,
nom varchar(50) NOT NULL,
prenom varchar(50) NOT NULL,
birth_date integer
Constraint date_nass Check (birth_date > 1950),
emb_date date,
salaire Decimal(7,2)
Constraint salaireInf check (salaire > 500)
)
CREATE TABLE Categorie
(
id_cat integer identity Constraint PK_Cat Primary Key,
Lib varchar(10) constraint libCat unique
)
Create table Commande
(
id_cmde integer identity
AU : 2014-2015

Pr.TIKITO

Corrig TD SGBD

Constraint PK_Cmd Primary Key,


#id_cat integer
Constraint FK_Cmd_Cat References Categorie(id_cat),
lib varchar(50),
px Decimal(7,2)
Constraint px_Cmd check (px > 0)
)
Create table Facture
(
num_fact integer ,
#id_cmde integer,
#id_serv integer,
qt integer Constraint qt_Fact check (qt > 0),
num_tab integer Constraint tab_Fact check (num_tab > 0),
date_fact date Default GetDate(),
Constraint PK_Fact Primary Key(num_fact, #id_cmde)
Constraint FK_Fact_Cmd Foreign Key (#id_cmde) References
Commande(id_cmde)
)
/*
Un exemple de cration de contrainte de cl trangre aprs avoir cr
la table
*/
Alter table Facture
Add constraint FK_Fact_Serv Foreign Key (#id_serv) References
Serveur(id_serv)

------------------------------------------------------------------------------ 2. Insrer les trois catgories de commande.


----------------------------------------------------------------------------/*
Attention: l'ordre d'insertion influence la valeur de la cl primaire
vu que c'est une Identity
*/
Insert into Categorie(lib)
values ('Entre')
Insert into Categorie
values ('Plat')

AU : 2014-2015

Pr.TIKITO

Corrig TD SGBD

Insert into Categorie


values ('Dessert')
/*
Pour afficher le contenu de la table
*/
select *
from Categorie

------------------------------------------------------------------------------ 3. Insrer un exemple de commande pour chaque catgorie.


----------------------------------------------------------------------------/*
Attention:
1-l'ordre d'insertion influence la valeur de la cl primaire vu
que c'est une Identity
2-les valeurs donnes pour la cl trangre #id_cat doivent
exister dans la table Catgorie
*/
Insert into Commande(#id_cat,lib, px)
values (1,'salade',10)
Insert into Commande
values(2,'Sandwich',13)
Insert into Commande
values(2,'Frites',6)
Insert into Commande
values(3,'flan',8)

select *
from commande
------------------------------------------------------------------------------ 4. Insrer deux serveurs
----------------------------------------------------------------------------insert into serveur(id_serv,nom,prenom,birth_date,salaire)
values (1001, 'Toto','LOLO',1990,600)

AU : 2014-2015

Pr.TIKITO

Corrig TD SGBD

insert into serveur(id_serv,nom,prenom,birth_date,emb_date ,salaire)


values (1008, 'Tata','LALA',1998,'2010-06-06',700)
select *
from serveur
------------------------------------------------------------------------------ 5. Insrer une facture comportant deux commandes de la mme catgorie
----------------------------------------------------------------------------/*
Attention:
1-les valeurs donnes pour #id_cmde doivent correspondre pour la
mme catgorie (ref question3)
2-les valeurs donnes pour la cl trangre #id_cmde et #id_serv
doivent exister
*/
insert into Facture (num_fact, #id_cmde ,#id_serv,qt,num_tab)
values (60,2,1001,2,5)
insert into Facture (num_fact, #id_cmde ,#id_serv,qt,num_tab)
values (60,3,1001,1,5)

select *
from facture
------------------------------------------------------------------------------6. Insrer une facture comportant trois commandes de catgories diffrentes
----------------------------------------------------------------------------/*
1-les valeurs donnes pour #id_cmde doivent correspondre aux 3
catgories (ref question3)
2-Ici c'est une autre syntaxe pour insrer plusieurs lignes en
mme temps
*/
insert into Facture (num_fact, #id_cmde ,#id_serv,qt,num_tab)
values (114290,1,1008,1,4),
(114290,2,1008,3,4),
(114290,4,1008,2,4)

AU : 2014-2015

Pr.TIKITO

Corrig TD SGBD

/* **************************************************************************
PARTI II: Manipulation des donnes
************************************************************************** */
------------------------------------------------------------------------------1. Quelles sont les commandes de la catgorie Dessert
----------------------------------------------------------------------------SELECT cmd.*
FROM commande cmd, categorie cat
WHERE id_cat = #id_cat
AND cat.lib='dessert'
------------------------------------------------------------------------------2. Calculer les quantits commandes de la commande frites
----------------------------------------------------------------------------SELECT SUM (qt) as 'Quantits Frites'
FROM facture ,commande
WHERE id_cmde = #id_cmde
and lib='frites'
------------------------------------------------------------------------------3. Afficher le nom des serveurs, leur ge, et le nombre de factures quils
ont pass aujourdhui.
----------------------------------------------------------------------------/*
1-year(getdate()) pour donner uniquement l'anne en cours, vu que
birth_date est uniquement l'anne de naissance
2-count(distinct(num_fact)) pour ne comptabiliser qu'une seule
fois la facture, mme si elle concerne plusieurs commandes
3-convert(date, GETDATE()) pour donner uniquement le jour le mois
et l'anne en cours, et non pas l'heure aussi
4-il faut faire attention de mentionner les champs nom,birth_date
dans la clause group by
*/

AU : 2014-2015

Pr.TIKITO

Corrig TD SGBD

SELECT nom,
year(getdate())- birth_date as Age,
count(distinct(num_fact)) as 'nombre de factures'
FROM facture ,serveur
WHERE id_serv = #id_serv
AND date_fact= convert(date, GETDATE())
GROUP BY nom,birth_date
------------------------------------------------------------------------------4. Quel est le prix de la commande la plus chre pour chaque catgorie
----------------------------------------------------------------------------SELECT #id_cat, MAX(px)as prix_max
FROM commande
GROUP BY #id_cat
/*
Mais si on veut le dtail des commandes les plus chres pour
chaque catgorie,
on devrait utiliser une sous-requte corrle
*/
SELECT *
FROM Commande C1
where px IN (SELECT MAX(px)as prix_max
FROM commande
WHERE #id_cat = C1.#id_cat
GROUP BY #id_cat)
------------------------------------------------------------------------------5. Afficher le dtail de la facture numro : 114290 (Num de la facture, nom
-serveur, libell de la commande, prix unitaire de la commande, quantit
-commande, prix_TTC) [ Prix_ttc = (prix unitaire * qt)*1.2 ]
----------------------------------------------------------------------------SELECT num_fact AS 'Num de la facture',
nom AS 'Nom du serveur',
lib AS 'libell de la commande',
px AS 'prix unitaire de la commande',
qt AS 'quantit commande',
px*qt*1.2 as prix_TTC
FROM Facture, Serveur,Commande
WHERE id_serv=#id_serv
AND id_cmde=#id_cmde
AND num_fact=114290
AU : 2014-2015

Pr.TIKITO

Corrig TD SGBD

------------------------------------------------------------------------------6. Combien de tables ont pass des commandes


----------------------------------------------------------------------------select COUNT(distinct num_tab) as table_commande
from facture
------------------------------------------------------------------------------7. Augmenter le salaire des serveurs qui ont plus de 4 ans d'anciennet de
2.5%
----------------------------------------------------------------------------UPDATE serveur
SET salaire = salaire * 1.025
WHERE datediff(yyyy,emb_date,getdate()) > 4

------------------------------------------------------------------------------8. Supprimer les factures datant de plus de 2 ans. (Est-ce possible ?)


----------------------------------------------------------------------------/*
Oui c'est possible, la cl primaire de la table facture n'est pas
rfrence par une
cl trangre d'une autre table
*/
DELETE FROM facture
WHERE datediff(yyyy,date_fact,convert(date, GETDATE())) > 2

AU : 2014-2015

Pr.TIKITO