数据库习题自学练习

《数据库系统概论》(第五版)高等教育出版社 王珊 萨师煊 编著 课后习题自学练习,若有不足望指正。


P70T6

设有一个数据库SPJ数据库,包括S、P、J及SPJ 4个关系模式:

S(SNO,SNAME,STATUS,CITY);

P(PNO,PNAME,COLOR,WEINGHT);

J(JNO,JNAME,CITY);

SPJ(SNO,PNO,JNO,QTY)。

供应商表由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)。

零件表由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。

工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。


完成表的建立与数据的填入,如下所示:

s表

p表

j表

spj表


使用SQL语言完成以下查询:

(1)求供应工程J1零件的供应商号码SNO;

(2)求供应工程J1零件P1的供应商号码SNO;

(3)求供应工程J1零件为红色的供应商号码SNO;

(4)求没有使用天津供应商生产的红色零件的工程好JNO;

(5)求至少用了供应商S1所供应的全部零件的工程和JNO;


解答:

(1)在spj表里查询SNO为S1的条目的JNO即可。

select SNO from spj where JNO='J1';

(2)在spj表里查询JNO为J1且PNO为P1的条目的SNO即可。

select sno from spj where jno='j1' and pno='p1';

(3)在p表中查询颜色color和零件号PNO信息,在spj表中查询工程号JNO和零件号PNO信息,当spj表和p表中的的PNO相同时则该条目的供应商代码SNO则是我们需要查询到的信息。

SELECT sno from spj,p where jno='J1'and p.color='红' and spj.pno=p.pno;

(4)欲求没有使用天津供应商生产的红色零件的工程好JNO可以先求使用天津供应商生产的红色零件的工程好JNO然后与总体求反即可,使用NOT IN实现求反过程。

select jno from j where jno not in (select jno from spj,s,p where s.city='天津' and p.color='红' and spj.sno=s.sno and spj.pno=p.pno);

select jno from j where  not exists (select *from spj,s,p where s.city='天津' and p.color='红' and spj.sno=s.sno and spj.pno=p.pno and j.jno=spj.jno);

(5)欲求至少用了供应商S1所供应的全部零件的工程和JNO,可以使用NOT EXISTS语句实现。

select jno
from j
where not exists
(select *from spj
where spj.sno='S1' and
not exists(select *from p
where spj.pno=p.pno and spj.jno=j.jno
));

 


补充练习:

(1)找出所有供应商的姓名和所在城市;

select sname,city from s

(2)找出所有零件的名称 、颜色、重量;

select pname,color,weight from p;

(3)找出使用供应商S1所供应零件的工程号码;

select jno from spj where sno='S1';

(4)找出工程项目J2使用的各种零件的名称及其数量;

select p.pname,spj.qty from p,spj where p.pno=spj.pno and spj.jno='J2';

(5)找出上海厂商供应的所有零件号码;

select distinct p.pno from s,p,spj where s.city='上海' and p.pno=spj.pno and spj.sno=s.sno;

(6)找出使用上海产的零件的工程名称;

select distinct spj.jno from spj,s where s.city='上海' and spj.sno=s.sno;

(7)找出没有使用天津产的零件的工程号码;

select distinct spj.jno from spj,s where s.city!='天津' and spj.sno=s.sno;

(8)把全部红色零件的颜色改成蓝色;

update p
 set color='蓝'
 where color='红';

(9)由S5供给J4的零件P6改为由S3供应,请作必要的修改;

update spj
set spj.sno='s3'
where spj.sno='s5' AND spj.jno='j4';

(10)从供应商关系中删除S2的记录,并从供应情况关系中删除相应的记录;

由于S表中存在SPJ表中的外键,外键的动作为默认的动作为RESTRICT,所以应该先删除SPJ表中数据再删除S表中数据,否则会保存。(参考博客 mysql级联删除-----Mysql 的 Cascade Restrict,https://blog.csdn.net/codeforme/article/details/5539454

delete 
from spj 
where sno='S2';
delete 
from s
where sno='S2';

(11)请将(S2,J6,P4,200)插入供应情况关系。

由于已在上一问S2清除且有因为外键的缘故,该问在SPJ表里添加有S2的数据时,需要将S2补进S表。

 

insert
into spj(sno,pno,jno,qty)
values('S2','P4','J6',200);


建立一个供给情况的视图,包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY)。针对视图完成下列查询:

create view test as select sno,pno,qty from spj,j where spj.jno=j.jno and j.jname='三建';

 

(1)找出三建工程项目使用的各种零件代码及其数量;

select pno,sum(qty) from test group by pno;

(2)找出供应商S1的供应情况。

select * from test where sno='s1';

  • 16
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值