前言:
由于题目问题比较多知识点重复性比较强,博主打算先详细为大家分析一道题,让大家熟悉解题思路,为了避免篇幅过长,之后类似题型博主将直接给出答案不做过多分析,(注意:所有表达式均未用Markdown语法,如需表示下标,用如下格式)
eg:Π_{Tno}
(一)
(1)【分析】第一个问题是列出工资超过5000的教师的不同年龄。首先,需要从Work表中筛选出Salary > 5000的记录。这里应该用选择操作σ。但之后需要获取对应的教师年龄,所以需要和Teacher表进行自然连接,因为Work表里的Tno对应Teacher的Tno。连接之后,选择年龄属性,并且要去重,所以需要用投影π,并且加上不同的年龄,所以直接用π Tage。
按照这个操作的先后顺序我们可以按步骤写出表达式 σSalary>5000(Work)------>σSalary>5000(Work)⨝ Teacher-------->Π Tage(σ Salary>5000 (Work) ⨝ Teacher)
最终结果:Π Tage(σ Salary>5000 (Work) ⨝ Teacher)
(2)【分析】第二个问题是查找不在计算机系工作的教师代码。首先我们可以找出所有在计算机系工作的教师,然后用Teacher的Tno减去这些教师。具体步骤可能包括:先选择Dname='计算机系'的Department得到计算机系的Dno,然后和Work表自然连接,得到在计算机系工作的Tno,然后从Teacher的Tno中减去这部分。
按照这个操作的先后顺序我们可以按步骤写出表达式 σ Dname='计算机系' (Department)---> σ Dname='计算机系' (Department) ⨝ Work--->ΠTno (σ Dname='计算机系' (Department) ⨝ Work) --->ΠTno (Teacher) - ΠTno (σ Dname='计算机系' (Department) ⨝ Work)
最终结果:ΠTno (Teacher) - ΠTno (σ Dname='计算机系' (Department) ⨝ Work)
(3)【分析】第三个问题是系主任T1管辖范围内的所有教师姓名。系主任T1应该是指Department表中Tno='T1'的系主任所管理的部门。首先,找到Department表中Tno='T1'的Dno,也就是该系主任管理的部门。然后,Work表中这些Dno对应的教师Tno,再连接Teacher表获取姓名。所以表达式是π Tname (σ Tno='T1' (Department) ⨝ Work ⨝ Teacher)
按照这个操作的先后顺序我们可以按步骤写出表达式 σ Tno='T1' (Department)--->σ Tno='T1' (Department) ⨝ Work ⨝ Teacher(注意一定要先连接Work再连接Teacher,因为Teacher中没有Dno不能跟Department连接) --->Π Tname (σ Tno='T1' (Department) ⨝ Work ⨝ Teacher)
最终结果:Π Tname (σ Tno='T1' (Department) ⨝ Work ⨝ Teacher)
(4)【分析】第四个问题比较复杂,要找出比D1系所有教师工资都高的教师工号,首先获取D1系的所有工资,然后找到所有Work中的教师,其工资都大于D1系的每一个工资。(这可以通过双重否定:教师T的工资不存在在D1系中存在一个工资≥T的工资)接着可以用差减去那些存在D1系中工资≥当前工资的教师。这样,得到的是那些工资大于所有D1系工资的教师工号。
按照这个操作的先后顺序我们可以按步骤写出表达式 ρx(Work) × ρy(Work)(这一步是将整张Work表用x和y来表示,这样做的好处是可以很好的区分D1系和非D1系的教师,同时也让我们知道笛卡尔积可表示为一张二维表,我们也可以逆用这个性质当只给出二维表时我们可以将其用笛卡尔积的形式表示)--->Π x.Tno ( σ x.Salary ≤ y.Salary ∧ y.Dno='D1' (ρx(Work) × ρy(Work)) )(这一步是筛选出属于非D1系同时工资比D1系低的教师)--->Π Tno (Work) − Π x.Tno ( σ x.Salary ≤ y.Salary ∧ y.Dno='D1' (ρx(Work) × ρy(Work)) )(通过差排除属于非D1系同时工资比D1系低的教师,最终就得到所求教师的工号了)
最终结果:ΠTno (Work) − Π x.Tno ( σ x.Salary ≤ y.Salary ∧ y.Dno='D1' (ρx(Work) × ρy(Work)) )
(二)
【答案】
(1)ΠSNO(σJNO='J1'(SPJ))
(2)ΠSNO(σJNO='J1'∧PNO='P1'(SPJ)) ((1) (2)直接在 SPJ 表上筛选条件并投影结果)
(3)ΠSNO(σJNO='J1'(SPJ)⨝σCOLOR='红'(P))(通过连接 SPJ 和 P 表关联零件颜色与供应记录)
(4)ΠJNO(J) − ΠJNO(σCITY='天津'(S) ⨝ SPJ ⨝ σCOLOR='红'(P))(结合 S、P、SPJ 表筛选特定条件,再通过差集排除不符合的工程号)
(5)ΠJNO,PNO(SPJ) ÷ ΠPNO(σSNO='S1'(SPJ)) (关系代数中处理“所有”,"全部"通常用除法)
(三)
【答案】
(1) ∏姓名,工作单位(σ读者号=‘R016’(读者))
(2) ∏姓名(σ图书号=‘B5’(读者⨝ 借阅))
(3) ∏书名(σ姓名=‘李林’(读者⨝ 借阅⨝ 图书))
(4) ∏书名(σ姓名 =‘李林’∧ 还期 = NULL(读者 ⨝ 借阅⨝ 图书))
(四)
【答案】
(1) ∏Sno(σCno=‘2’(SC))
(2) ∏Sno,Sname (σSno=‘03’(S))
(3) ∏Sno,Sname(σSage >20 ∧ Ssex=‘男’(S))
(4) ∏Sno,Sname (S⨝ SC )
(5) ∏Cno,Cname (C ⨝ SC)
(6) ∏Sname,Grade (S ⨝ (σCno=‘5’ (SC ) )
(7) ∏Sno,Sname (σCname=‘数据库原理’(S ⨝ SC⨝ C)
(五)
【答案】
(1)ΠSno, Grade(σCno='1137'(SC))
(2)ΠSname, Grade(σSsex='女'(S) ⋈ SC)
(3)ΠSno, Sname( (σCname='管理学'(C) ⋈ SC) ⋈ S )
(4)ΠSno, Sname, Sdept(S) − ΠSno, Sname, Sdept(σCno='1168'(SC) ⋈ S)
(5)ΠSname( (ΠSno, Cno(SC) ÷ ΠCno(C)) ⋈ S )