【专业课学习】《数据库原理》第二章习题

361 阅读2分钟

110400532_p1.png

2.2 简述关系运算基本运算,导出运算和核心运算。给出使用基本运算表示导出运算的表示方法。

【基本运算】

笛卡尔积××、并集(运算后两关系中重复的元组只保留一个)、差集-、选择σσ、投影ππ

【导出运算】

交集 RS=R(RS)R ∩ S = R - (R - S)

连接 RSR.AθS.B=σR.AθS.B(R×S)\underset{R.A θ S.B}{R ⋈ S} = σ_{\substack{R.A θ S.B}}(R×S)

Y=XYY' = X ∩ Y

R(X)÷S(Y)=πXY(R)πXY((πXY(R)×πY(S))R)R(X) ÷ S(Y) = π_{\substack{X - Y'}}(R) - π_{\substack{X - Y'}}((π_{\substack{X - Y'}}(R) × π_{\substack{Y'}}(S) )-R)

【核心运算】

选择σσ、投影ππ、连接

务必注意,并集、差集、交集运算都要求参与运算的两个关系具有相同的属性集!!!

2.3 简述等值连接和自然连接的的区别和联系。

等值连接:连接条件取等值的连接运算。(即R.A=S.BR.A = S.B

自然连接:具有公共属性且去掉重复列的等值连接。

联系:等值连接和自然连接都是要求属性间按照等值进行连接。

区别:

  • 自然连接要求两个关系中相等的分量必须是相同的属性组(存在公共属性/公共字段),等值连接没有该要求。
  • 自然连接要在结果中把重复的属性列去重,而等值连接不需要。
2.4 计算R(ABCDE)÷S(DE)R(A,B,C,D,E)÷S(D,E)

RR的元组如下:

{(x,a,x,a,1),(x,a,z,a,1),(x,a,z,b,1),(y,a,z,a,1),\{(x,a,x,a,1), (x,a,z,a,1), (x,a,z,b,1), (y,a,z,a,1),

(y,a,z,b,1),(z,a,z,a,1),(z,a,z,b,1),(z,a,y,b,1)}(y,a,z,b,1), (z,a,z,a,1), (z,a,z,b,1), (z,a,y,b,1)\}

SS的元组如下:{(a,1),(b,1)}\{(a,1),(b,1)\}

结果:{(x,a,z),(y,a,z),(z,a,z)}\{ (x, a, z), (y,a,z), (z,a,z) \}

2.5 已知工程管理数据库的关系如下:

供应商S(供应商号SNo,供应商名SName,所在城市City)

零件P(零件号PNo,零件名PName,颜色Color,重量Weight)

工程J(工程号JNo,工程名JName,所在城市City)

供应SPJ(SNo,PNo,JNo,供应数量Qty)

注:一个工程可以接收多个供应商的多次供应

请完成如下查询:

(1)查找上海的各工程名。

πJName(σCity=上海(J))π_{\substack{JName}}(σ_{\substack{City=上海}}(J))

(2)查询供应商(SNo=S1)给工程(JNo=J2)供应的所有零件名。

πPName(σSNo=S1JNo=J2(SPJ)P)π_{\substack{PName}} (σ_{\substack{SNo=S1∧JNo=J2}} (SPJ) ⋈ P)

(3)查询北京的工程使用蓝色零件的工程名。

πJName(σCity=北京(J)SPJσColor=蓝色(P))π_{\substack{JName}} (σ_{\substack{City=北京}} (J) ⋈ SPJ ⋈ σ_{\substack{Color=蓝色}} (P) )

(4)查询没有使用S1所供应零件的工程号。

πJNo(J)πJNo(σSNo=S1(SPJ))π_{\substack{JNo}} (J) - π_{\substack{JNo}} (σ_{\substack{SNo=S1}} (SPJ))

(5)查询找出能提供零件号为P3的供应商的编号。

πSNo(σPNo=P3(SPJ))π_{\substack{SNo}} ( σ_{\substack{PNo=P3}} (SPJ) )

(6)查询能提供供应商S1所提供的所有零件的供应商

πSNo,PNo(SPJ)÷πPNo(σSNo=S1(SPJ)) π_{\substack{SNo,PNo}} (SPJ) ÷ π_{\substack{PNo}} ( σ_{SNo=S1} (SPJ))

(7)查询不提供零件P1和P2的供应商。

πSNo(S)πSNo(σPNo=P1PNo=P2(SPJ))π_{\substack{SNo}} (S) - π_{\substack{SNo}} (σ_{\substack{PNo=P1 ∨ PNo=P2}} (SPJ) )

(8)查询同时提供零件P1和P2的供应商。

πSNo(σPNo=P1(SPJ))πSNo(σPNo=P2(SPJ)) π_{\substack{SNo}}(σ_{\substack{PNo=P1}}(SPJ)) ∩ π_{\substack{SNo}}(σ_{\substack{PNo=P2}}(SPJ))

(9) 查询同供应商S1在同一城市的供应商所提供的所有零件。

符合题目条件的供应商编号 T=πSNo,City(S)÷πCity(σSNo=S1(S))T = π_{\substack{SNo,City}} (S) ÷ π_{\substack{City}} ( σ_{\substack{SNo=S1}} (S) )

符合题目条件的供应商所提供的所有零件 πPNo(TSPJ)π_{\substack{PNo}} (T ⋈ SPJ)

(10)查询供应红色的P1零件,且在某一次供应中供应该种零件的数量大于1000的供应商。

πSNo(σPNo=P1Qty>1000Color=红色(SPJP))π_{\substack{SNo}} (σ_{\substack{PNo=P1∧Qty>1000∧Color=红色}} (SPJ ⋈ P) )

2.6 已知读者订单管理数据库的关系如下:

读者Read(读者号RNo,读者名RName,读者身份Status,读者城市City)

图书Book(书号BNo,书名BName,书价Price,出版社Publisher)

订单OrderForm(订单号ODNo,BNo,订书数量Quantity)

订单读者索引Index(ODNo,RNo)

请完成如下查询:

(1)找出科学出版社出版的全部书号和价格。

πBNo,Price(σPublisher=科学出版社(Book))π_{\substack{BNo,Price}} (σ_{\substack{Publisher=科学出版社}} (Book) )

(2)找出有订单的书名和订单号。

πBName,ODNo(OrderFormBook)π_{\substack{BName,ODNo}} (OrderForm ⋈ Book)

(3)找出订购数量为20的所有订单号和书号。

πODNo,BNo(σQuantity=20(OrderForm))π_{\substack{ODNo,BNo}} (σ_{\substack{Quantity=20}} (OrderForm) )

(4)找出至少订购了“数据库技术”的读者号。

πRNo(σBName=数据库技术(BookOrderFormIndex))π_{RNo} (σ_{\substack{BName=数据库技术}} (Book⋈OrderForm⋈Index))

(5)找出没有订购任何图书的读者号。

πRNo(Read)πRNo(OrderFormIndex)π_{RNo} (Read) - π_{RNo} (OrderForm ⋈ Index)

2.7 已知商品销售数据库的关系如下:

商品SP(商品码SPNO,商品名SPN)

库存KC(SPNO,库存数量SL1)

销售XS(SPNO,KHNO,销售日期RQ,销售数量SL2,单价DJ)

客户KH(客户码KHNO,客户名KHN)。

请完成以下查询:

(1)查询所有商品的全部信息。

πSPNO,SPN(SP)π_{SPNO,SPN} (SP)

(2)查询客户“蓝天食品厂”所购的商品码和数量。

πSPON,SL2(σKHN=蓝天食品厂(XSKH))π_{SPON,SL2} (σ_{KHN=蓝天食品厂} (XS ⋈ KH) )

(3)查询客户名为‘1616’所购商品的库存数量。

πSL1(σKHN=1616(KH)XSKC)π_{SL1} (σ_{KHN=1616} (KH) ⋈ XS ⋈ KC)

(4)查询购买所有商品的客户名。

πKHN((KHXS)÷πSPNO(SP))π_{KHN} ((KH ⋈ XS) ÷ π_{SPNO} (SP))

2.8 已知运输公司数据库的关系如下:

Team(TNo,TName,Phone)

Car(CNo,Company,CDate,TNo)

Driver(DNo,DName,Phone,TNo,WDate)

代码含义:

Team-车队:TNo-车队编号;TName-车队名称;Phone-电话

Car-车辆:CNo-车辆编号;Company-生产厂家;CDate-出厂日期

Driver-司机:DNo-司机编号;DName-姓名;Phone-电话;WDate-聘期

请完成如下查询:

(1)查询生产厂家是“金龙公司”的车辆信息,显示数据为CNo,Company,CDate,TNo。

πCNo,Company,CData,TNo(σCompany=金龙公司(Car))π_{CNo,Company,CData,TNo} (σ_{Company=金龙公司} (Car))

(2)查询李明司机的名称、电话和聘期,显示数据为DName,Phone,和WDate。其中:Phone为司机的电话。

πDName,Phone,WDate(σDName=李明(Driver))π_{DName,Phone,WDate} (σ_{DName=李明} (Driver))

(3)查询车队编号为“01”的车辆信息,显示数据为TName,Phone,CNo,Company和CDate。其中:Phone为车队的电话。

πTName,Phone,CNo,Company(σTNo=01(CarTeam))π_{TName,Phone,CNo,Company} (σ_{TNo=01} (Car ⋈ Team))

(4)查询车队名称为“翔龙车队”的司机信息,显示数据为TName, Phone(该电话为车队电话,DName和Phone(该电话为司机电话)。

πTName,Team.Phone,DName,Driver.Phone(DriverσTName=翔龙车队(Team))π_{TName,Team.Phone,DName,Driver.Phone} (Driver ⋈ σ_{TName=翔龙车队} (Team))

(5)查询运输公司车队、车辆和司机的信息清单,显示数据为TName,Phone(该电话为车队电话,CNo,Company,CDate,DName,Phone(该电话为司机电话)和WDate。

πTName,Team.Phone,CNo,Company,CDate,DName,Driver.Phone(TeamDriverCar)π_{TName,Team.Phone,CNo,Company,CDate,DName,Driver.Phone} (Team ⋈ Driver ⋈ Car)

2.9 已知学籍管理数据库的关系如下:

学生S(学号SNo,姓名SName,性别SSex,年龄SAge,班级Class,学院Coll)

课程C(课程号CNo,课程名CName,先修课CPNo,学分Credit)

选课SC(学号SNo,课程号CNo,成绩Grade)

请完成如下任务:

(1)查询男生的基本信息。

σSSex=(S)σ_{SSex=男} (S)

(2)查询学生的姓名、年龄和班级。

πSName,SAge,Class(S)π_{SName,SAge,Class} (S)

(3)查询物流1602班的学生的学号。

πSNo(σClass=物流1602(S))π_{SNo} ( σ_{Class=物流1602} (S) )

(4)查询选修英语的学生的姓名。

πSName(SSCσCName=英语(C))π_{SName} (S ⋈ SC ⋈ σ_{CName=英语} (C))

(5)查询选修所有课程的学生的学号和姓名

πSNo,SName,CNo(SSC)÷πCNo(C)π_{SNo,SName,CNo} (S ⋈ SC) ÷ π_{CNo} (C)

(6)把学号、课程号和成绩分别为2016010201、020102和96的元组添加到选课SC。

SC(SNo=2016010201,CNo=020102,Grade=96)SC ∪ (SNo=2016010201, CNo=020102, Grade=96)

(7)在选课SC中,删除学号为“2016010201”、选修课为“网球”的元组。

答案一:SCπSNo,CNo,Grade(σSNo=2016010201CName=网球(SCC))SC - π_{SNo,CNo,Grade} ( σ_{SNo=2016010201∧CName=网球} (SC ⋈ C) )

答案二:SCπCNo(σCName=网球(C))πSNo=2016010201(SC)SC - π_{CNo} ( σ_{CName=网球} (C) ) ⋈ π_{SNo=2016010201} ( SC )

答案二是老师发的参考答案上给的解法,说实话有点巧妙...

(8)查询“信息学院”的学生信息。

σColl=信息学院(S)σ_{Coll=信息学院} (S)

(9)查询“外语学院”,并且年龄小于等于16岁或者大于22岁的学生信息。

σColl=外语学院(SAge16SAge22)(S)σ_{Coll=外语学院∧(SAge≤16 ∨ SAge > 22)} (S)

(10)查询学生的姓名和所在学院。

πSName,Coll(S)π_{SName,Coll} (S)

(11)查询“信息学院”的学生的学号和姓名。

πSNo,SName(σColl=信息学院(S))π_{SNo,SName} ( σ_{Coll=信息学院} (S) )

(12)查询“软件学院”,并且年龄小于等于16或者大于22岁的学生的姓名、性别和年龄。

πSName,SSex,SAge(σColl=软件学院(SAge16SAge22)(S))π_{SName,SSex,SAge} ( σ_{Coll=软件学院∧(SAge≤16 ∨ SAge > 22)} (S) )

(13)查询选修了课程的学生的学号。

πSNo(SC)π_{SNo} (SC)

(14)查询年龄在19 ~ 22岁(包括19岁和22岁)之间的学生的姓名、性别和年龄。

πSName,SSex,SAge(σSAge19SAge22(S))π_{SName,SSex,SAge} ( σ_{SAge≥19 ∧ SAge ≤ 22} (S) )

(15)查询外语学院、数学学院和工商学院学生的姓名和性别。

πSName,SSex(σColl=外语学院Coll=数学学院Coll=工商学院(S))π_{SName,SSex} ( σ_{Coll=外语学院 ∨ Coll=数学学院 ∨ Coll=工商学院} (S) )

(16)查询至少选修了课程号分别为:020101、030102和060206三门课程的学生的学号。

T={(CNo=020101),(CNo=030102),(CNo=060206)}T = \{(CNo=020101),(CNo=030102),(CNo=060206)\}

则所求结果为 πSNo(SC÷T)π_{SNo} (SC ÷ T)

(17)查询选修课程号为020101或者030102或者060206的课程的学生的学号。

πSNo(σCNo=020101CNo=030102CNo=060206(SC))π_{SNo} (σ_{CNo=020101 ∨ CNo=030102 ∨ CNo=060206} (SC))

(18)查询只选修课程号分别为:020101、030102和060206三门课程的学生的学号。

先求至少选了这三名课学生的学号:

T=(CNo=020101),(CNo=030102),(CNo=060206)T = {(CNo=020101), (CNo=030102), (CNo=060206)}

X=πSNo(SC÷T)X = π_{SNo} (SC ÷ T)

再求有这三门课之外的选课记录的学生的学号:

Y=πSNo(σCNo020101CNo030102CNo060206(SC))Y = π_{SNo} (σ_{CNo≠020101∧CNo≠030102∧CNo≠060206} (SC))

则题目所求为 XYX - Y

(19)查询选修了“数据库原理”课程的男生的学号和姓名。

πSNo,SName(σCName=数据库原理SSex=(SCCS))π_{SNo,SName} (σ_{CName=数据库原理∧SSex=男} (SC⋈C⋈S))

(20)查询至少选修了一门课程其先修课的课程号为2016010201的学生的姓名。

πSName(SCSσCPNo=2016010201(C))π_{SName} (SC⋈S⋈σ_{CPNo=2016010201} (C) )