You are on page 1of 6

Université des Sciences et de la Technologie d’Oran -Mohammed BOUDIAF-

Faculté des Mathématiques et Informatique


Département d’Informatique
Master I Bases de données avancées Année 2020-2021

Révision TP N°1 - Corrigé


Corrigé vidéo

1 Création des tables


ˆ Usine
create table u s i n e (
nu integer primary key ,
nomu varchar ( 1 5 ) not null ,
v i l l e varchar ( 1 5 ) not null ) ;

ˆ Produit
create table p r o d u i t (
np integer primary key ,
nomp varchar ( 2 0 ) not null ,
c o u l e u r varchar ( 1 0 ) ,
p o i d s r e a l not null ,
check ( p o i d s > 0 ) ) ;

ˆ Fournisseur
create table f o u r n i s s e u r (
n f integer primary key ,
nomf varchar ( 2 5 ) not null ,
s t a t u t varchar ( 2 5 ) not null ,
v i l l e varchar ( 1 5 ) not null ,
e m a i l varchar ( 5 0 ) unique not null ,
check ( ) e m a i l l i k e ’%@%’ ) ) ;

ˆ Livraison
create table l i v r a i s o n (
np integer ,
nu integer ,
n f integer ,
q u a n t i t e integer not null ,
primary key ( np , nu , n f ) ,
foreign key ( np ) r e f e r e n c e s p r o d u i t ( np ) ,
foreign key ( n u l ) r e f e r e n c e s u s i n e ( n u l ) ,
foreign key ( n f ) r e f e r e n c e s f o u r n i s s e u r ( n f ) ,
check ( q u a n t i t e > 0 ) ) ;

2 Insertion de données
ˆ Usine
insert into usine values (1 , ’ Citroen ’ , ’ Paris ’ ) ;
insert into usine values (2 , ’ Peugeot ’ , ’ Sochaux ’ ) ;
insert into usine values (3 , ’ Citroen ’ , ’ Sochaux ’ ) ;
insert into usine values (4 , ’ Renault ’ , ’ Paris ’ ) ;
insert into usine values (5 , ’ Toyota ’ , ’ Lyon ’ ) ;

1
ˆ Produit
insert into produit values (1 , ’ P l a q u e t t e ’ , ’ Noir ’ , 0 . 2 5 7 ) ;
insert into produit values (2 , ’ S i e g e ’ , ’ Rouge ’ , 1 5 . 2 3 0 ) ;
insert into produit values (3 , ’ S i e g e ’ , ’ Vert ’ , 1 5 . 2 3 0 ) ;
insert into produit values (4 , ’ Pare = b r i s e ’ , null , 1 1 . 9 0 0 ) ;
insert into produit values (5 , ’ R e t r o v i s e u r ’ , ’ Vert ’ , 1 . 0 2 0 ) ;

ˆ Fournisseur
i n s e r t into f o u r n i s s e u r values
( 1 , ’ Monroe ’ , ’ P roduc teu r ’ , ’ Lyon ’ , ’ monroe@gmail . com ’ ) ;
i n s e r t into f o u r n i s s e u r values
( 2 , ’Au bon s i e g e ’ , ’ Sous = t r a i t a n t ’ , ’ Limoges ’ , ’ a u b o n s i e g e @ g m a i l . com ’ ) ;
i n s e r t into f o u r n i s s e u r values
( 3 , ’ S a i n t Gobain ’ , ’ Pr oduc teur ’ , ’ P a r i s ’ , ’ s a i t g o b a i n @ g m a i l . com ’ ) ;

ˆ Livraison
insert into livraison values (3 ,1 ,2 ,60);
insert into livraison values (1 ,2 ,3 ,2500);
insert into livraison values (1 ,3 ,3 ,3000);
insert into livraison values (2 ,2 ,3 ,120);
insert into livraison values (3 ,1 ,1 ,49);
insert into livraison values (3 ,2 ,1 ,45);
insert into livraison values (3 ,3 ,1 ,78);
insert into livraison values (2 ,4 ,2 ,52);
insert into livraison values (2 ,1 ,1 ,250);

3 Exprimer en SQL les requêtes suivantes


1. Donner le numéro, le nom et la ville de toutes les usines.
s e l e c t * from u s i n e ;

2. Donner le numéro et le nom de toutes les usines de Sochaux.


s e l e c t nu , nomu
from u s i n e
where v i l l e = ’ Sochaux ’ ;

3. Donner le numéro des fournisseurs qui livrent l’usine 1 en produit 3.


select nf
from l i v r a i s o n
where nu = 1 and np = 3 ;

4. Donner le numéro et le nom des produits qui n’ont pas de couleur renseignée.
s e l e c t np , nomp from p r o d u i t where c o u l e u r i s null ;

5. Donner le nom des usines sans doublon (trié par ordre croissant).
s e l e c t d i s t i n c t nomu from u s i n e order by nomu ;

6. Donner le numéro des usines dont le nom commence par C.


s e l e c t nu from u s i n e where nomu l i k e ’C%’ ;

7. Donner le numéro des produits dont le nom contient s ou S.


s e l e c t np from p r o d u i t where nomp l i k e ’%s%’ or nomp l i k e ’%S%’ ;

2
Ou (En transformant tous les nom de produits en miniscule)
s e l e c t np from p r o d u i t where lower (nomp) l i k e ’%s%’ ;

Ou (En transformant tous les noms de produits en majuscule)


s e l e c t np from p r o d u i t where upper (nomp) l i k e ’%S%’ ;

8. Donner les noms des fournisseurs qui approvisionnent l’usine 1 en produit 3.


En utilisant les jointures:
s e l e c t d i s t i n c t nomf from f o u r n i s s e u r , l i v r a i s o n
where f o u r n i s s e u r . n f = l i v r a i s o n . n f and l i v r a i s o n . nu=1 and l i v r a i s o n . np=3;

En utilisant les sous-requêtes:


s e l e c t d i s t i n c t nomf
from f o u r n i s s e u r
where n f in ( s e l e c t n f from l i v r a i s o n where nu=1 and np =3);

9. Donner le nom et la couleur des produits livrés par le fournisseur 2.


En utilisant les jointures:
s e l e c t d i s t i n c t NomP, Couleur
from p r o d u i t , l i v r a i s o n
where l i v r a i s o n . np = p r o d u i t . np and n f = 2 ;

En utilisant les sous-requêtes:


s e l e c t NomP, Couleur from p r o d u i t
where np in ( s e l e c t np from l i v r a i s o n where n f =2);

10. Donner les numéros des fournisseurs qui approvisionnent l’usine 1 en produit rouge.
En utilisant les jointures:
select distinct nf
from l i v r a i s o n , p r o d u i t
where Couleur = ’ Rouge ’ and l i v r a i s o n . np=p r o d u i t . np and nu=1;

En utilisant les sous-requêtes:


select distinct nf
from l i v r a i s o n
where np in ( s e l e c t np from p r o d u i t where c o u l e u r= ’ Rouge ’ ) and nu = 1 ;

11. Donner les noms des fournisseurs qui approvisionnent une usine de Sochaux ou de Paris en produit rouge.
s e l e c t d i s t i n c t NomF
from l i v r a i s o n , p r o d u i t , f o u r n i s s e u r , u s i n e
where Couleur= ’ Rouge ’ and l i v r a i s o n . np=p r o d u i t . np and l i v r a i s o n . n f=f o u r n i s s e u r . n f
and l i v r a i s o n . nu=u s i n e . nu and ( u s i n e . v i l l e = ’ Sochaux ’ or u s i n e . v i l l e = ’ P a r i s ’ ) ;

12. Donner les numéros des produits livrés à une usine par un fournisseur de la même ville.
s e l e c t d i s t i n c t np
from l i v r a i s o n , f o u r n i s s e u r , u s i n e
where l i v r a i s o n . n f=f o u r n i s s e u r . n f and l i v r a i s o n . nu=u s i n e . nu
and u s i n e . v i l l e =f o u r n i s s e u r . v i l l e ;

13. Donner les numéros des usines qui ont au moins un fournisseur qui n’est pas de la même ville.

3
s e l e c t d i s t i n c t l i v r a i s o n . nu
from l i v r a i s o n , f o u r n i s s e u r , u s i n e
where l i v r a i s o n . n f=f o u r n i s s e u r . n f and l i v r a i s o n . nu=u s i n e . nu
and u s i n e . v i l l e <>f o u r n i s s e u r . v i l l e ;

14. Donner les numéros des fournisseurs qui approvisionnent à la fois les usines 1 et 2.
En utilisant l’intersection:
s e l e c t n f from l i v r a i s o n where nu = 1
intersect
s e l e c t n f from l i v r a i s o n where nu = 2 ;

En utilisant les sous-requêtes:


s e l e c t d i s t i n c t n f from l i v r a i s o n
where nu = 1 and n f in ( s e l e c t n f from l i v r a i s o n where nu =2);

En utilisant les aliaces:


select distinct l1 . nf
from l i v r a i s o n l 1 , l i v r a i s o n l 2
where l 1 . n f=l 2 . n f and l 1 . nu=1 and l 2 . nu=2;

15. Donner les numéros des usines qui utilisent au moins un produit disponible chez le fournisseur 3 (c’est-à-dire un produit
qu’il livre mais pas nécessairement à cette usine).
s e l e c t d i s t i n c t nu
from l i v r a i s o n
where np in ( s e l e c t np from l i v r a i s o n where n f =3);

16. Donner les numéros des usines qui s’approvisionnent uniquement chez le fournisseur 3.
s e l e c t NU
from l i v r a i s o n
where nu not in ( s e l e c t nu from l i v r a i s o n where nf <>3);

17. Donner les numéros des usines qui ne reçoivent aucun produit rouge d’un fournisseur parisien.
s e l e c t nu from l i v r a i s o n
where nu not in ( s e l e c t nu from l i v r a i s o n , f o u r n i s s e u r , p r o d u i t
where l i v r a i s o n . np=p r o d u i t . np and l i v r a i s o n . n f=f o u r n i s s e u r . n f
and c o u l e u r= ’ Rouge ’ and v i l l e = ’ P a r i s ’ ) ;

18. Donner le nombre total de fournisseurs.


s e l e c t count ( * ) from f o u r n i s s e u r ;

19. Donner le nombre de produits ayant une couleur renseignée.


s e l e c t count ( * ) from p r o d u i t where c o u l e u r i s not null ;

Ou:
s e l e c t count ( c o u l e u r ) from p r o d u i t ;

20. Donner la moyenne des poids des produits.


s e l e c t avg ( p o i d s ) from p r o d u i t s ;

21. Donner la somme des poids des produits verts.


s e l e c t sum( p o i d s ) from p r o d u i t where c o u l e u r= ’ Vert ’ ;

4
22. Donner le plus petit poids des produits dont on connaı̂t la couleur.
s e l e c t min( Poids ) from p r o d u i t where c o u l e u r i s not null ;

23. Donner le nombre de produits livrés par chaque fournisseur (décrit par leur numéro).
s e l e c t nf , count ( d i s t i n c t np ) from l i v r a i s o n
group by n f ;

24. Donner le poids moyen des produits selon leur couleur.


s e l e c t c o u l e u r , avg ( p o i d s ) from p r o d u i t
group by c o u l e u r ;

25. Donner la couleur des produits dont le poids moyen est supérieur à 10kg.
s e l e c t c o u l e u r , avg ( p o i d s ) from p r o d u i t
group by c o u l e u r
having avg ( p o i d s ) > 1 0 ;

26. Donner le nombre de produits livrés par un fournisseur de Paris.


s e l e c t count ( d i s t i n c t np ) from l i v r a i s o n , f o u r n i s s e u r
where l i v r a i s o n . n f=f o u r n i s s e u r . n f and v i l l e = ’ P a r i s ’ ;

27. Donner le numéro du produit le plus léger (ou les numéros des produits les plus légers si plusieurs produits ont ce même
poids).
s e l e c t np from p r o d u i t
where p o i d s in ( s e l e c t min( p o i d s ) from p r o d u i t ) ;

Ou:
s e l e c t np from p r o d u i t
where p o i d s <= a l l ( s e l e c t p o i d s from p r o d u i t ) ;

28. Donner le nombre de produits livrés par chaque fournisseur (décrit par leur nom).
s e l e c t NomF, count ( d i s t i n c t np ) from l i v r a i s o n , f o u r n i s s e u r
where l i v r a i s o n . n f=f o u r n i s s e u r . n f
group by NomF;

29. Donner les numéros des usines qui achètent au fournisseur 3 tous les produits qu’il fournit.
s e l e c t d i s t i n c t nu
from l i v r a i s o n
where n f=3
group by nu
having count ( d i s t i n c t np)=( s e l e c t count ( d i s t i n c t np )
from l i v r a i s o n where n f =3);

30. Donner les numéros des produits qui sont livrés à toutes les usines de Paris.
s e l e c t d i s t i n c t l i v r a i s o n . np
from l i v r a i s o n , u s i n e
where l i v r a i s o n . nu=u s i n e . nu and u s i n e . v i l l e = ’ P a r i s ’
group by l i v r a i s o n . np
having count ( d i s t i n c t l i v r a i s o n . nu)=( s e l e c t count ( nu )
from u s i n e where v i l l e = ’ P a r i s ’ ) ;

31. Donner les numéros des fournisseurs qui approvisionnent toutes usines avec un même produit.

5
select distinct nf
from l i v r a i s o n
group by nf , np
having count ( d i s t i n c t nu)=( s e l e c t count ( nu ) from u s i n e ) ;

32. Donner pour chaque usine (décrit par leur numéro), la quantité totale de produits livrés (attention, les usines n’ayant
aucune livraison doivent apparaı̂tre dans les résultats).
s e l e c t u s i n e . nu , sum( q u a n t i t e ) from u s i n e
l e f t j o i n l i v r a i s o n on u s i n e . nu=l i v r a i s o n . nu
group by u s i n e . nu ;

33. Donner les numéros des fournisseurs qui fournissent au moins un produit fourni par un fournisseur qui fournit au moins
un produit rouge.
select d i s t i n c t n f from l i v r a i s o n where np in (
select np from l i v r a i s o n where n f in (
select n f from l i v r a i s o n where np in (
select np from p r o d u i t where c o u l e u r= ’ Rouge ’ ) ) ) ;

34. Supprimer tous les produits de couleur noire et de numéro compris entre 1 et 3.
Remarque: Etant donné l’utilisation de la contraite de clé étrangère sur la colonne np dans la table livraison, la
suppression d’un produit ayant un np existant dans la table livraison sera bloquée par le SGBD (Stratégie utilisée par
défaut).
Solution: supprimer toutes les livraisons relatives à ces produits avant de les supprimer de la table pdouit.
delete from l i v r a i s o n where np in ( s e l e c t np from p r o d u i t where c o u l e u r= ’ Noir ’
and np between 1 and 3 ) ;

delete from p r o d u i t where np>=1 havingand np<=3 havingand c o u l e u r= ’ Noir ’ ;

35. Changer la ville du fournisseur 3 : il a déménagé à Lyon.


update f o u r n i s s e u r set v i l l e = ’ Lyon ’ where n f =3;

You might also like