數據庫習題自學練習

《數據庫系統概論》(第五版)高等教育出版社 王珊 薩師煊 編著 課後習題自學練習,若有不足望指正。


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 jno from spj where sno='S1';

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章