DS1 requetes

publicité
Bases des Données
Devoir Surveillé n°1 : requêtes SQL
durée 1 heure
aucun document n’est autorisé
Soit le modèle logique suivant
Ecrivez les
suivantes :
requêtes
SQL
permettant
d’obtenir
les
informations
•
personne(id, nom, prenom)
•
commande(id, dateCommande, idPersonne)
•
ligne(idCommande, numLigne, idProduit, quantite)
1. Montant total des commandes par marque ;
produit(id, nom, prix, idMarque)
2. Id et nom des personnes dont le montant total des commandes dépasse
300€
•
3. Nom et prix des produits qui n’ont jamais été commandés ;
Ce MLD permet de définir le schéma physique suivant :
4. Nom des personnes qui ont passé au moins une commande ;
Table « personne »
•
id : entier, clé primaire ;
•
nom : texte ;
•
prenom : texte
5. Id de la commande la plus récente de chaque personne ;
6. Id des produits dont le prix est supérieur au prix moyen des produits de
la même marque ;
7. Id, nom et prénom des personnes qui n’ont rien commandé ;
Table « commande »
•
id : chaîne de 3 caractères, clé primaire ;
8. Nom et prénom des personnes qui ont commandé des écrans plats en
septembre, mais pas octobre ;
•
dateCommande : date ;
9. Id des commandes qui ne concernent pas des écrans ;
•
idPersonne : entier, clé secondaire
10. Liste des produits triés dans l’ordre: de celui dont le prix est le plus
proche de la moyenne, à celui dont le prix est le plus éloigné.
table « ligne »
•
idCommande : chaîne de 3 caractères, clé étrangère ;
•
numLigne : entier ;
•
idProduit : chaîne de 3 caractères, clé étrangère ;
•
quantite : entier ;
11. Chiffre d’affaire de chaque marque. Les marques pour lesquelles aucun
produit n’a été commandé doivent apparaître avec un chiffre d’affaire
égal à zéro ;
12. Pourcentage de personnes n’ayant passé aucune commande ;
La clé primaire est composée des champs « idCommande » et « numLigne »
13. Id, nom et marque des produits pour lesquels il existe un autre produit
moins cher et qui porte le même nom ;
table « produit »
14. Nombre de personnes ayant commandé le produit le plus cher ;
•
id : chaîne de 3 caractères, clé primaire ;
•
nom : texte ;
•
prix : nombre décimal ;
•
idMarque : chaîne de 3 caractères
Semestre 3 - Bases de Données
Devoir Surveillé n°1
15. Id des produits qui apparaissent dans toutes les commandes ;
page 1
Semestre 3 - Bases de Données
Devoir Surveillé n°1
page 2
9/----------------------------------------------------------------------------
Corrigé du Bases des Données
DS n°1 : requêtes SQL
select id from commande
except
select l.idCommande
from ligne l join produit pdt on l.idProduit=pdt.id
where pdt.nom like'%cran%';
1/-----------------------------------------------------------------------------
10/----------------------------------------------------------------------------
select idMarque, sum(l.quantite*pdt.prix)
from ligne l join produit pdt on l.idProduit=pdt.id
group by idMarque;
select id, prix
from produit
order by abs(prix-(select avg(prix) from produit));
2/----------------------------------------------------------------------------
11/----------------------------------------------------------------------------
select per.id, per.nom,sum(l.quantite*pdt.prix)
from personne per join commande cmd on per.id=cmd.idPersonne
join ligne l on cmd.id=l.idCommande
join produit pdt on l.idProduit=pdt.id
group by per.id,per.nom
having sum(l.quantite*pdt.prix)>300;
select idMarque, sum(prix*quantite)
from produit join ligne on ligne.idProduit=produit.id
group by idMarque
union
select idMarque,0
from produit
where idMarque not in
(select idMarque
from produit join ligne on ligne.idProduit=produit.id) ;
3/---------------------------------------------------------------------------select nom, prix
from produit
where id not in (select idProduit from ligne);
12/----------------------------------------------------------------------------
4/---------------------------------------------------------------------------select distinct nom
from personne per join commande cmd on per.id=cmd.idPersonne;
select 100*count(*)/(select count(*) from personne)
from personne
where id not in (select idPersonne from commande);
5/----------------------------------------------------------------------------
13/----------------------------------------------------------------------------
select id,dateCommande
from commande c1
where dateCommande = (select max(dateCommande) from commande where
idPersonne=c1.idPersonne);
14/----------------------------------------------------------------------------
select p1.id, p1.nom, p1.idMarque
from produit p1 join produit p2 on p1.nom=p2.nom
where p1.prix<p2.prix;
select count(*)
from personne
where id in (select idPersonne
from commande join ligne on commande.id=ligne.idCommande
join produit on produit.id=ligne.idProduit
where produit.prix=(select max(prix) from produit)
) ;
6/---------------------------------------------------------------------------select id
from produit pdt1
where prix>(select avg(prix) from produit pdt2 where
pdt1.idMarque=pdt2.idMarque);
7/----------------------------------------------------------------------------
ou
select id,nom,prenom
from personne where id not in (select idPersonne from commande);
select count(distinct idPersonne)
from commande join ligne on commande.id=ligne.idCommande
join produit on produit.id=ligne.idProduit
where produit.prix=(select max(prix) from produit) ;
8/---------------------------------------------------------------------------select per.nom, per.prenom
from personne per join commande cmd on per.id=cmd.idPersonne
join ligne l on cmd.id=l.idCommande
join produit pdt on l.idProduit=pdt.id
where pdt.nom='écran plat' and date_part('month',cmd.dateCommande)=9
except
select per.nom, per.prenom
from personne per join commande cmd on per.id=cmd.idPersonne
join ligne l on cmd.id=l.idCommande
join produit pdt on l.idProduit=pdt.id
where pdt.nom='écran plat' and date_part('month',cmd.dateCommande)=10;
Semestre 3 - Bases de Données
Devoir Surveillé n°1
15/---------------------------------------------------------------------------select id
from produit
where (select count(distinct commande.id)
from commande join ligne on commande.id=ligne.idCommande
where idProduit=produit.id)
=
(select count(*) from commande) ;
page 3
Semestre 3 - Bases de Données
Devoir Surveillé n°1
page 4
Téléchargement