Questions A :
- le langage SQL est redondant, ce qui permet d'exprimer une même requête de multiples façons. Trouvez 8 expressions différentes (avec et sans sous requêtes) pour obtenir le nom des fournisseurs qui ont livrés la pièce P2
- on veut connaître le nombre de lignes de livraisons dont le poids est supérieur à la moyenne des poids de toutes les livraisons existantes (solution avec sous requête)
- on souhaite obtenir le nom des pièces dont le poids est strictement supérieur au poids de n'importe quelle pièce bleue (solution avec sous requête)
- on souhaite connaître les numéros des pièces qui sont fournies par un fournisseur de Paris (solution avec sous requête)
- on souhaite connaître les noms des fournisseurs qui ne fournissent pas la pièce P2 (solution avec exists et solution avec in)
- on souhaite connaître les numéros des pièces fournies par un fournisseur de Londres à un projet de Londres (solution avec sous requête(s))
- on souhaite connaître les fournisseurs qui fournissent à des projets dans une ville différente de la leur [comme tous les fournisseurs répondent à cette condition, supprimons virtuellement de la base de donnée les commandes (S4,P6,J3,300)] (solution avec sous requête(s))
- on souhaite obtenir les numéros des projets auxquels la pièce P1 a été fournie, à condition que la quantité moyenne de toutes les pièces fournies à ce projet (pas uniquement P1) soit supérieure à la plus grande quantité livrée (QTY) d'une pièce fournie au projet J1 "par un même fournisseur" (solution avec sous requête(s))
- on souhaite connaître les numéros des pièces qui sont d'une couleur qu'aucune autre pièce n'a (solution avec count et solution avec singular)
- on souhaite connaître les numéros de projets pour lesquels on a fourni au total plus de 1000 pièces (les 1000 pièces ne doivent pas être les mêmes) (solution sans sous requête, solution avec sous requête et in, solution avec sous requête et exists)
- on souhaite obtenir les noms de projets auxquels la moyenne des pièces fournies tout fournisseur confondu est supérieur à la moyenne des pièces fournies (tout fournisseur confondus) aux projets de Oslo (solution avec sous requête, solution avec sous requête qui possède elle même une sous requête)
- idem que 11, en affichant en plus le numéro du projet (une seule version suffit)
- quels sont les numéros de mois des dernières livraisons de la pièce la plus livrée à l'ensemble des projets (la pièce la plus livrée est P3… mais cela on ne le sait pas lorsqu'on écrit la requête) ?
- quelles sont les pièces qui ont été livrées (la dernière fois) à la même date ? affichez le numéro de la pièce et la date
Réponses A :
- # select distinct sname from SPJ join S on SPJ.id_s=S.id_s where SPJ.id_p='P2'
#
select distinct sname from S where
exists(select * from spj where SPJ.id_s=S.id_s and SPJ.id_p='P2')
# select
distinct sname from S where S.id_s in(select SPJ.id_s from SPJ where SPJ.id_p='P2')
# select
distinct S.sname from S where (select count(*) from SPJ where SPJ.id_s=S.id_s
and id_p='P2') >= 1
# select
distinct sname from S where S.id_s = any(select SPJ.id_s from SPJ where SPJ.id_p=’P2’)
# select
distinct sname from S where ‘P2’ in(select SPJ.id_p from SPJ where SPJ.id_s=S.id_s)
# select
distinct sname from S, SPJ where SPJ.id_s=S.id_s and SPJ.id_p=’P2’
# select
distinct sname from S where ‘P2’ = any(select SPJ.id_p from SPJ where SPJ.id_s=S.id_s)
- # select count(*) from SPJ join P on SPJ.id_p=P.id_p where qty*weight > (select avg(qty*weight) from SPJ join P on SPJ.id_p=P.id_p)
- # select pname from P where weight > all(select weight from p where color = 'Blue')
- # select distinct id_p from SPJ where id_s in(select id_s from S where city = 'Paris')
#
select distinct id_p from SPJ where (select city from S where SPJ.id_s=S.id_s) = 'Paris'
- # select sname from S where id_s not in(select id_s from SPJ where id_p='P2')
#
select sname from S where not exists(select * from SPJ where S.id_s=SPJ.id_s and id_p='P2')
- # select id_p from SPJ where (select city from S where S.id_s=SPJ.id_s) = 'London' and (select city from J where J.id_j=SPJ.id_j) = 'London'
- # select distinct id_s from SPJ where (select city from S where S.id_s=SPJ.id_s) <> (select city from J where J.id_j=SPJ.id_j)
#
select id_s from S where exists(select * from SPJ join J on SPJ.id_j=J.id_j where S.city <>
J.city and SPJ.id_s=S.id_s)
- # select distincte SPJA.id_j from SPJ SPJA where SPJA.id_p = 'P1' and (select avg(SPJB.qty) from SPJ SPJB where SPJA.id_j=SPJB.id_j) > (select max(SPJC.qty) from SPJ SPJC where SPJC.id_j = 'J1')
- # select id_p from SPJ where (select city from S where S.id_s=SPJ.id_s) = 'London' and (select city from J where J.id_j=SPJ.id_j) = 'London'
- # select id_j from SPJ group by id_j having sum(qty) > 1000
#
select distinct id_j from J where id_j in(select id_j from SPJ group by id_j having sum(qty) > 1000)
#
select
distinct id_j from J where exists(select id_j from SPJ where
SPJ.id_j=J.id_j group by id_j having sum(qty)
> 1000)
- # select jname from SPJ join J on J.id_j=SPJ.id_j group by jname having avg(qty) > (select avg(qty) from SPJ join J on J.id_j=SPJ.id_j where city = 'Oslo')
#
select jname from SPJ join J on J.id_j=SPJ.id_j group by jname having avg(qty) > (select avg(qty) from SPJ
where id_j in(select id_j from J where city = 'Oslo'))
- # select id_j,jname from SPJ join J on J.id_j=SPJ.id_j group by id_j,jname having avg(qty) > (select avg(qty) from SPJ join J on J.id_j=SPJ.id_j where city = 'Oslo')
- # select distinct extract(month from date_derniere_livraison) from SPJ where id_p = (select id_p from SPJ group by id_p having sum(qty) >= all(select sum(qty) from SPJ group by id_p))
- # select id_p,date_derniere_livraison from SPJ SPJ1 where (select count(*) from SPJ SPJ2 where SPJ1.date_derniere_livraison=SPJ2.date_derniere_livraison) >= 2
Questions B :
Ecrire, pour chacun des exercices proposés, une requête sans sous
requête, avec sous requête utilisant le quantificateur EXISTS, l'opérateur
ensembliste IN (2x) et liée naturellement.
- on souhaite connaître les noms des pièces qui sont fournies, lors d'une livraison, en 500 unités
- on souhaite connaître les numéros de pièces fournies par un fournisseur de Paris
- on souhaite connaître les noms des pièces fournies par le fournisseur S2
- on souhaite connaître les noms des fournisseurs de la pièce P2
- on souhaite connaître les noms des fournisseurs qui ne fournissent pas la pièce P2
- on souhaite connaître les noms des fournisseurs d'au moins une pièce de couleur rouge
- on souhaite connaître les numéros des fournisseurs et les noms des fournisseurs qui fournissent des pièces au projet Console
Réponses B :
- # select distinct pname from spj join p on p.id_p=spj.id_p where qty = 500
# select
distinct pname from P where exists(select * from spj where spj.id_p = p.id_p and qty = 500)
# select
distinct pname from P where id_p in(select id_p from spj where qty = 500)
# select
distinct pname from P where 500 in(select qty from spy where spj.id_p=p.id_p)
# select
distinct pname from P where (select count(*) from spj where spj.id_p=p.id_p and qty=500) >= 1
- # select distinct id_p from spj join s on s.id_s=spj.id_s where city='Paris'
# select
distinct id_p from spj where exists(select * from s where s.id_s=spj.id_s and city='Paris')
# select
distinct id_p from spj where id_s in(select id_s from s where city='Paris')
# select
distinctid_p from spj where 'Paris' in(select city from s where spj.id_s =
s.id_s)
# select
distinct id_p from spj where (select count(*) from s where s.id_s=spj.id_s and city = 'Paris') >= 1
|| select
distinct id_p from spj where (select city from s where pj.id_s = s.id_s) =
'Paris'
- # select distinct pname from spj join p on p.id_p=spj.id_p where id_s = 'S2'
# select
distinct pname from p where exists(select * from spj where p.id_p=spj.id_p and id_s='S2')
# select
distinct pname from p where id_p in(select id_p from spj where id_s='S2')
# select
distinct pname from p where 'S2' in(select id_s from spj where spj.id_p =
p.id_p)
# select
distinct pname from p where (select count(*) from spj where spj.id_p=p.id_p and id_s='S2') >= 1
- # select distinct sname from spj join s on s.id_s=spj.id_s where id_p='P2'
# select
distinct sname from S where exists(select * from SPJ where s.id_s=spj.id_s and id_p='P2')
# select
distinct sname from S where id_s in(select id_s from SPJ where id_p='P2')
# select
distinct sname from s where 'P2' in(select id_p from spj where spj.id_s =
s.id_s)
# select
distinct sname from S where (select count(*) from SPJ where s.id_s=spj.id_s and id_p='P2') >= 1
- # (besoin de la soustraction)
# select
distinct sname from S where NOT exists(select * from SPJ where s.id_s=spj.id_s
and id_p='P2')
# select
distinct sname from S where id_s NOT in(select id_s from SPJ where id_p='P2')
# select
distinct sname from s where 'P2' NOT in(select id_p from spj where spj.id_s =
s.id_s)
# select
distinct sname from S where (select count(*) from SPJ where s.id_s=spj.id_s and id_p='P2') = 0
- # select distinct sname from spj join s on s.id_S=spj.id_s join p on p.id_p=spj.id_p where color='Red'
# select
distinct sname from s where exists(select * from spj join p on p.id_p=spj.id_p
where color = 'Red' and spj.id_s=s.id_s)
# select
distinct sname from s where id_s in(select id_s from spj join p on p.id_p=spj.id_p
where color = 'Red')
# select
sname from s where (select count(*) from spj join p on p.id_p=spj.id_p where color = 'Red' and
s.id_s=spj.id_s) >= 1
- # select distinct id_s,sname from spj join s on s.id_s=spj.id_s join j on j.id_j=spj.id_j where jname = 'Console'
#
select
distinct id_s, sname from s where exists(select * from spj join j on
j.id_j=spj.id_j where jname = 'Console' and
s.id_s=spj.id_s)
# select
id_s,sname from s where id_s in(select id_s from spj join j on j.id_j=spj.id_j
where jname = 'Console')
#
select
id_s,sname from s where (select count(*) from spj join j on
j.id_j=spj.id_j where jname = 'Console'
and
s.id_s=spj.id_s) >= 1
ConversionConversion EmoticonEmoticon
Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.