Vous êtes sur la page 1sur 7

Cours : BDD Avancées : BDDR et SQL

TP : N°1 Prof : A. Benmakhlouf Site Web : http://coursbenmakhlouf.me.ma

TP1 : Oracle : Base de données Relationnelles et Langage SQL

Rq1 : Chiffre d’affaire annuel

select extract(year from DateCommande) as Ann, SUM(Prixunitaire*Quantite*(1-


Remise/100)) as CA
FROM Commandes, Lignecommandes, Produits
WHERE Commandes.Idcommande=Lignecommandes.Idcommande
AND Lignecommandes.Idproduit=Produits.Idproduit
GROUP BY extract(year from DateCommande);

Rq2 : Créer une vue « Rq2 » pour afficher le CA par client et par année.

create view Rq2 as select CodeClient, Societe, extract(year from DateCommande) as Ann,
SUM(Prixunitaire*Quantite*(1-Remise/100)) as CA
FROM Clients, Commandes, Lignecommandes, Produits
WHERE Clients.IDClient=Commandes.Idclient
1
Cours : BDD Avancées : BDDR et SQL
TP : N°1 Prof : A. Benmakhlouf Site Web : www.cours-informatique.be.ma

AND Commandes.Idcommande=Lignecommandes.Idcommande
AND Lignecommandes.Idproduit=Produits.Idproduit
GROUP BY CodeClient, Societe, extract(year from DateCommande);

Rq3: créer une vue « Rq3 » pour afficher le meilleur CA par années

Create View Rq3 as select Ann, Max(Ca) as CAMAX


FROM Rq2
group by Ann
order by Ann;

Rq4: en utilisant les sous requêtes Rq2 et Rq3, afficher le client qui a réalisé ce meilleur CA par année

select CodeClient, Societe, CAMAX


FROM Rq2, Rq3
WHERE Rq2.Ann=Rq3.Ann
AND Rq2.Ca=Rq3.Camax;

2
Cours : BDD Avancées : BDDR et SQL
TP : N°1 Prof : A. Benmakhlouf Site Web : www.cours-informatique.be.ma

Rq5:
a- Reprenez la requête « Rq4 » mais cette fois en utilisant les vues matérialisées suivantes :
MVRq2 qui affiche les mêmes données que Rq2

CREATE MATERIALIZED VIEW VMRq2


REFRESH ON COMMIT
COMPLETE AS
select CodeClient, Societe, extract(year from DateCommande) as Ann,
SUM(Prixunitaire*Quantite*(1-Remise/100)) as CA
FROM Clients, Commandes, Lignecommandes, Produits
WHERE Clients.IDClient=Commandes.Idclient
AND Commandes.Idcommande=Lignecommandes.Idcommande
AND Lignecommandes.Idproduit=Produits.Idproduit
GROUP BY CodeClient, Societe, extract(year from DateCommande);

MVRq3 qui affiche les mêmes données que Rq3

CREATE MATERIALIZED VIEW VMRQ3


REFRESH ON COMMIT
COMPLETE AS
select Ann, Max(Ca) as CAMAX
FROM VMRq2
group by Ann;

b- Comparez les temps de réponse de Rq4 et de Rq5.

select CodeClient, Societe, CAMAX


FROM Rq2, Rq3
WHERE Rq2.Ann=Rq3.Ann
AND Rq2.Ca=Rq3.Camax;

select CodeClient, Societe, CAMAX


FROM VMRq2, VMRq3
WHERE VMRq2.Ann=VMRq3.Ann
AND VMRq2.Ca=VMRq3.Camax;

Le temps d’exécution de la RQ4 est 0.125 sec


Le temps d’exécution de la RQ5 est 0.016 sec

3
Cours : BDD Avancées : BDDR et SQL
TP : N°1 Prof : A. Benmakhlouf Site Web : www.cours-informatique.be.ma

Dans le cas de l’utilisation des sous requêtes le temps d’exécution va nettement diminuer si on transforme les
sous-requêtes en Vue Matérialisées.

Rq6- Afficher les commandes réalisé le mois actuel.

select IDcommande, Datecommande


FROM COmmandes
WHERE extract(month from Datecommande)= extract(month from sysdate)
AND extract(year from Datecommande)= extract(year from sysdate)

Rq7- Afficher les commandes réalisé le mois dernier puis analyser cette requête pour vérifier si elle
valable quel que soit la data actuelle.

select IDcommande, Datecommande


FROM COmmandes
WHERE extract(month from Datecommande)= extract(month from sysdate)-1
AND extract(year from Datecommande)= extract(year from sysdate);

Problème si le mois actuel est 1 (janvier). pour résoudre ce problème il faut introduire un
traitement conditionnel.

select IDcommande, Datecommande


FROM COmmandes

4
Cours : BDD Avancées : BDDR et SQL
TP : N°1 Prof : A. Benmakhlouf Site Web : www.cours-informatique.be.ma

WHERE extract(month from Datecommande)= DECODE(extract(month from sysdate), 1, 12,


extract(month from sysdate)-1)
AND extract(year from Datecommande)= DECODE(extract(month from sysdate), 1,
extract(year from sysdate)-1, extract(year from sysdate));

Rq8- Nombre de commande de l’année actuelle

select extract(year from Datecommande), count(IDcommande) as nbre


FROM Commandes
WHERE extract(year from Datecommande)= extract(year from sysdate)
GROUP by extract(year from Datecommande);

select count(IDcommande) as nbre


FROM Commandes
WHERE extract(year from Datecommande)= extract(year from sysdate);

Rq9- créer une vue « Rq8 » pour afficher les catégories des produits commandées par clients

select Codeclient, societe, Nomdecategorie


FROM Clients, Commandes, LigneCommandes, Produits, Categories
WHERE clients.IdClient=Commandes.Idclient
AND Commandes.Idcommande=Lignecommandes.Idcommande
AND Lignecommandes.Idproduit=Produits.Idproduit
AND Produits.Idcateg=Categories.Idcateg
Order by Codeclient, societe;

5
Cours : BDD Avancées : BDDR et SQL
TP : N°1 Prof : A. Benmakhlouf Site Web : www.cours-informatique.be.ma

Rq10- créer une vue « Rq9 » pour afficher les catégories des produits non encore commandées par
chaque client

select codeclient, societe, nomdecategorie


FROM clients L, Categories R
WHERE NOT EXISTS (select * from Rq8 where L.codeclient = Rq8.codeclient
AND R.nomdecategorie=Rq8.nomdecategorie);

Rq11- En utilisant la vue Rq9, afficher les clients qui ont commandé les produits de toutes les
catégories.

select * from clients


WHERE IDclient NOT IN (select IDclient from RQ9);

Rq12- Les produit les plus commandés pour chaque année avec un nombre de commande Max >=10 :

create view V1 as select extract(year from datecommande) as ANN, Produits.IDproduit,


Designation, count(Commandes.IdCommande) as Nbre
FROM commandes, Lignecommandes, produits
WHERE Commandes.Idcommande=Lignecommandes.Idcommande
6
Cours : BDD Avancées : BDDR et SQL
TP : N°1 Prof : A. Benmakhlouf Site Web : www.cours-informatique.be.ma

AND Lignecommandes.Idproduit=Produits.Idproduit
GROUP By extract(year from datecommande), Produits.IDproduit, Designation;

create view V2 as select ANN, Max(Nbre) as MaxNbre


FROM V1
GROUP by ANN;

select V1.ANN, IDProduit, Designation, MaxNBRE


FROM V1, V2
WHERE V1.Ann=V2.Ann
AND V1.Nbre=V2.Maxnbre
order by RqV1.ANN;

Vous aimerez peut-être aussi