數據庫系統原理--第2章作業2--習題答案

題目:

設有一個SPJ 數據庫,包括S、P、J 及SPJ4 個關係模式
S(SNO, SNAME ,STATUS,CITY);
P(PNO, PNAME, COLOR, WEIGHT):
J(JNO, JNAME, CITY);
SPJ(SNO,PNO,JNO,QTY)。
供應商表S 由供應商代碼(SNO)、供應商姓名( SNAME)、供應商狀態( STATUS)、供應商所在城市(CITY)組成。
零件表P 由零件代碼(PNO)、零件名( PNAME)、顏色( COLOR)、重量( WEIGHT)組成。
工程項目表J 由工程項目代碼(JNO)、工程項目名(JNAME)、工程項目所在城市(CITY)組成。
供應情況表SPJ 由供應商代碼(SNO) 、零件代碼(PNO)、工程項目代碼(JNO)、供應數量(QTY) 組成,表示某供應商供應某種零件給某工程項目的數量爲QTY。
今有若干數據如下:
在這裏插入圖片描述
試用關係代數完成如下查詢:SPJ
(1)求供應工程J1 零件的供應商號碼SNO;
(2)求供應工程J1 零件P1 的供應商號碼SNO;
(3)求供應工程J1 零件爲紅色的供應商號碼SNO;
(4)求沒有使用天津供應商生產的紅色零件的工程號JNO;
(5)求至少用了供應商S1 所供應的全部零件的工程號JNO。

答案

(1)
ΠSNO(σJNO=‘J1’(SPJ))
(2)
ΠSNO(σJNO='J1’∧PNO=‘P1’(SPJ))
(3)
ΠSNO(ΠJNO,PNO(σJNO=‘J1’(SPJ))∞ΠPNO(σCOLOR=‘紅’§))
(4)
ΠJNO(J)-ΠJNO(ΠSNO(σCITY=‘天津’(S))∞ΠPNO(σCOLOR=‘紅’§)∞ΠSNO,JNO,PNO(SPJ))
(5)
ΠJNO,PNO(SPJ)÷ΠPNO,SNO(σSNO=‘S1’(SPJ))

說明:把這段代碼複製到軟件上一步步運行即可出現題目要求的表,以及題目的答案;每道題SQL查詢語言和關係代數查詢語言在後面。想自己操作的話可以複製到軟件上運行下。

--創建數據庫
CREATE DATABASE SPJ
--使用數據庫
USE SPJ
--創建S表
CREATE TABLE S(
SNO CHAR(10) PRIMARY KEY,
SNAME CHAR(50) UNIQUE,
STATUS INT,
CITY CHAR(20))
--添加數據到S表
INSERT INTO S(SNO,SNAME,STATUS,CITY)
VALUES('S1','精益',20,'天津'),
('S2','盛錫',10,'北京'),
('S3','東方紅',30,'北京'),
('S4','豐泰盛',20,'天津'),
('S5','爲民',30,'上海')
--檢驗
SELECT * FROM S
--創建P表
CREATE TABLE P(
PNO CHAR(10) PRIMARY KEY,
PNAME CHAR(50) ,
COLOR CHAR(20),
WEIGHT INT)
--添加數據到P表
INSERT INTO P(PNO,PNAME,COLOR,WEIGHT)
VALUES('P1','螺母','紅',12),
('P2','螺栓','綠',17),
('P3','螺絲刀','藍',14),
('P4','螺絲刀','紅',14),
('P5','凸輪','藍',40),
('P6','齒輪','紅',30)
--檢驗
SELECT * FROM P
--創建J表
CREATE TABLE J(
JNO CHAR(10) PRIMARY KEY,
JNAME CHAR(50) UNIQUE ,
CITY CHAR(20))
--添加數據到J表
INSERT INTO J(JNO,JNAME,CITY)
VALUES('J1','三建','北京'),
('J2','一汽','長春'),
('J3','彈簧廠','天津'),
('J4','造船廠','天津'),
('J5','機車廠','唐山'),
('J6','無線電廠','常州'),
('J7','半導體廠','南京')
--檢驗
SELECT * FROM J
---創建SPJ表
CREATE TABLE SPJ(
SNO CHAR(10),
PNO CHAR(10),
JNO CHAR(10),
QTY INT,
PRIMARY KEY(SNO,PNO,JNO),
FOREIGN KEY(SNO) REFERENCES S(SNO),  --外鍵約束
FOREIGN KEY(PNO) REFERENCES P(PNO),
FOREIGN KEY(JNO) REFERENCES J(JNO),
)
--添加數據到SPJ表
INSERT INTO SPJ(SNO,PNO,JNO,QTY)
VALUES ('S1','P1','J1',200),
('S1','P1','J3',100),
('S1','P1','J4',700),
('S1','P2','J2',100),
('S2','P3','J1',400),
('S2','P3','J2',200),
('S2','P3','J4',500),
('S2','P3','J5',400),
('S2','P5','J1',400),
('S2','P5','J2',100),
('S3','P1','J1',200),
('S3','P3','J1',200),
('S4','P5','J1',100),
('S4','P6','J3',300),
('S4','P6','J4',200),
('S5','P2','J4',100),
('S5','P3','J1',200),
('S5','P6','J2',200),
('S5','P6','J4',500)
--檢驗
SELECT * FROM SPJ

--題目:試用關係代數完成如下查詢:SPJ
--(1)求供應工程J1 零件的供應商號碼SNO;
SELECT * FROM SPJ
WHERE JNO='J1'
--關係代數:ΠSNO(σJNO=‘J1’(SPJ))
--(2)求供應工程J1零件P1的供應商號碼SNO:
SELECT * FROM SPJ
WHERE JNO='J1'AND PNO ='P1'
--關係代數:ΠSNO(σJNO='J1'∧PNO='P1'(SPJ))
--(3)求供應工程J1零件爲紅色的供應商號碼SNO:
SELECT * FROM SPJ
WHERE JNO = 'J1' AND PNO IN (
SELECT PNO FROM P
WHERE COLOR='紅')
--關係代數:ΠSNO(ΠJNO,PNO(σJNO='J1'(SPJ))∞ΠPNO(σCOLOR='紅'(P)))
--(4)求沒有使用天津供應商生產的紅色零件的工程號JNO:
SELECT JNO FROM J
WHERE JNO NOT IN(
SELECT JNO FROM SPJ,P,S
WHERE S.CITY='天津'
AND P.COLOR='紅'
AND SPJ.PNO=P.PNO
AND SPJ.SNO=S.SNO
)
--關係代數:ΠJNO(J)-ΠJNO(ΠSNO(σCITY='天津'(S))∞ΠPNO(σCOLOR='紅'(P))∞ΠSNO,JNO,PNO(SPJ))
--解析:減法運算中被減的部分是使用了天津供應商的紅色零件的所有工程號,
--ΠJNO(J)是全部工程的工程號,兩者相減就是題意了
--(5)求至少用了供應商S1所供應的全部零件的工程號JNO:
--由於VFP不允許子查詢嵌套太深,將查詢分爲兩步
--A、查詢S1供應商供應的零件號
SELECT PNO FROM SPJ WHERE SNO='S1'--結果是(P1,P2)
--B、查詢哪一個工程既使用P1零件又使用P2零件。
SELECT * FROM SPJ 
WHERE PNO='P1'
AND JNO IN (SELECT JNO FROM SPJ WHERE PNO='P2')--結果是J4
--關係代數:ΠJNO,PNO(SPJ)÷ΠPNO,SNO(σSNO='S1'(SPJ))

想自己實操一下如圖說明

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