数据库习题自学练习

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


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表

数据库习题自学练习_第1张图片

p表

数据库习题自学练习_第2张图片

j表

数据库习题自学练习_第3张图片

spj表

数据库习题自学练习_第4张图片


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

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

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

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

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

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


解答:

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

select jno from spj where sno='S1';

数据库习题自学练习_第5张图片

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

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

数据库习题自学练习_第6张图片

(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;

数据库习题自学练习_第7张图片

(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);

数据库习题自学练习_第8张图片

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);

数据库习题自学练习_第9张图片

(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
));

 

数据库习题自学练习_第10张图片


补充练习:

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

select sname,city from s

数据库习题自学练习_第11张图片

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

select pname,color,weight from p;

数据库习题自学练习_第12张图片

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

select jno from spj where sno='S1';

数据库习题自学练习_第13张图片

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

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

数据库习题自学练习_第14张图片

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

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

数据库习题自学练习_第15张图片

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

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

数据库习题自学练习_第16张图片

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

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

数据库习题自学练习_第17张图片

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

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

数据库习题自学练习_第18张图片

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

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

数据库习题自学练习_第19张图片

(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';

数据库习题自学练习_第20张图片

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

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

 

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

数据库习题自学练习_第21张图片


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

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

 

数据库习题自学练习_第22张图片

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

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

数据库习题自学练习_第23张图片

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

select * from test where sno='s1';

数据库习题自学练习_第24张图片

你可能感兴趣的:(自学笔记,后端自学)