DB2602 - 关系代数的应用
设有一个如下表所示的学生选课数据库,其中:带下划线属性是码;同一门课同一个学生只能有一条选课记录;成绩采用百分制,课程成绩大于或等于60分为‘通过’。
题目隐含条件别遗漏
| 关系 | 属性集 | 关系模式 |
|---|---|---|
| 学生 | 学号, 学生姓名, 就读院系, 年级 | S ( sno, sname, dept, grade ) |
| 课程 | 课程号, 课程名, 开课院系, 课程学分 | C ( cno, cname, dept, credit ) |
| 教师 | 教师编号, 教师姓名, 工作院系 | T ( tno, tname, dept ) |
| 选课 | 学号, 课程号, 授课教师编号, 成绩, 授课年份 | L ( sno, cno, tno, score, year ) |
请用关系代数写出下述查询。
1.满足下述条件的学生的学号和姓名:选修了课程名为“数据管理基础”的课程;
\[\pi_{S.sno,S.sname}(\pi_{cno}(\sigma_{C.cname='数据管理基础'}(C))\bowtie L \bowtie S)\]
多了一层括号,没有连用自然连接
2.满足下述条件的教师的姓名和工作院系:只讲授过自己工作院系开设的课程;
\[\pi_{T.tname,T.dept}((\pi_{T.tno}(T \bowtie L) - \pi_{T.tno}(\sigma_{C.dept \neq T.dept \wedge C.cno=L.cno \wedge T.tno=L.tno}(C \times T \times L)))\bowtie T)\]
参考答案 1:
\[\pi_{tname,dept}(T \bowtie (\pi_{tno}(L) - \pi_{T.tno}(\sigma_{C.dept \neq T.dept \wedge C.cno=L.cno \wedge T.tno=L.tno}(C \times T \times L))))\]与原提交的答案相比
- 最外层自然连接 \(T\) 前置更醒目
- 内层被减数简化
- 最外层投影直接使用属性名
参考答案 2:
\[\pi_{tname,dept}(\pi_{T.tno,tname,dept}(T \bowtie L) - \pi_{T.tno,tname,T.dept}(\sigma_{T.tno=L.tno \wedge C.dept \neq T.dept}(T \times (C \bowtie L))))\]自然连接时若有同名属性需格外注意
在使用 ‘差’ 运算时,在减数和被减数关系模式中需要包含查询目标的码(教师编号 \(tno\))
3.满足下述条件的学生的学号和姓名:选修通过了‘智软’学院开设的所有课程;
使用除法:
\[\pi_{S.sno,S.sname}((\pi_{sno,cno}(\sigma_{L.score \geq 60}(L)) \div \pi_{cno}(\sigma_{C.dept='智软'}(C)))\bowtie S)\]参考答案 1:
\[\pi_{S.sno,S.sname}(S \bowtie (\pi_{sno,cno}(\sigma_{L.score \geq 60}(L)) \div \pi_{cno}(\sigma_{C.dept='智软'}(C))))\]参考答案 2:
\[\pi_{sno, sname, cno}(S \bowtie \sigma_{score \geq 60}(L)) \div \pi_{cno}(\sigma_{dept='智软'}(C))\]
不使用除法:
\[\pi_{S.sno,S.sname}((\pi_{sno}(L) - \pi_{sno}(\pi_{S.sno,C.cno}(\sigma_{C.dept='智软'}(S\times C)) - \pi_{sno,cno}(\sigma_{score \geq 60}(L)))) \bowtie S)\]参考答案 3:
\[\pi_{sno, sname}(S \bowtie (\pi_{sno}(S) - \pi_{sno}((\pi_{sno}(S) \times \pi_{cno}(\sigma_{dept='智软'}(C))) - \pi_{sno, cno}(\sigma_{score \geq 60}(L)))))\]参考答案 4:
\[\pi_{sno, sname}(S) - \pi_{sno, sname}((\pi_{sno, sname}(S) \times \pi_{cno}(\sigma_{dept='智软'}(C))) - \pi_{sno, sname, cno}(\sigma_{score \geq 60}(L) \bowtie S))\]
4.满足下述条件的教师的姓名和工作院系:讲授过自己工作院系开设的所有课程;
\[\pi_{T.tname,T.dept}(T \bowtie (\pi_{T.tno}(L)-\pi_{T.tno}(\pi_{T.tno,C.cno}(T \bowtie C) - \pi_{tno,cno}(L))))\]现在看来 \(\pi_{T.tno}(L)\) 这一项明显有误
参考答案 1:
\[\pi_{tname,dept}(T \bowtie (\pi_{tno}(T)-\pi_{tno}(\pi_{tno,cno}(T \bowtie C) - \pi_{tno,cno}(L))))\]
- 至少存在一门自己工作院系开设的课程还没有讲授过的教师(总 - 实际讲授):
\[R1 = \pi_{tno}(\pi_{tno,cno}(T \bowtie C) - \pi_{tno,cno}(L))\]
- 符合题意的教师:
\[R2 = \pi_{tno}(T) - R1\]
- 再与教师关系连接获取姓名和院系(略)
注意:最外层被减数 \(\pi_{tno}(T)\)
- AI 提示:在处理关系代数的除法等价转换时,最外层的被减数应当始终使用实体集本身的投影
参考答案 2:
\[\pi_{tname, dept}(\pi_{tno, tname, dept}(T) - \pi_{tno, tname, dept}(\pi_{tno, tname, dept, cno}(T \bowtie C) - \pi_{tno, tname, dept, cno}(L \bowtie T)))\]
- 但不能错误表示为(减法没 “码”):
\[\pi_{\text{tname}, \text{dept}}(T) - \pi_{\text{tname}, \text{dept}}(\pi_{\text{tname}, \text{dept}, \text{cno}}(T \bowtie C) - \pi_{\text{tname}, \text{dept}, \text{cno}}(L \bowtie T))\]
5.查询每一门课程的历史最高成绩和最低成绩,结果返回课程号、课程历史最高成绩和最低成绩。
令 \(A := L\)
\[B = \pi_{cno,score}(L) - \pi_{L.cno,L.score}(L\mathop{\bowtie}\limits_{L.score < A.score \wedge L.cno = A.cno} A)\]\[C = \pi_{cno,score}(L) - \pi_{L.cno,L.score}(L\mathop{\bowtie}\limits_{L.score > A.score \wedge L.cno = A.cno} A)\]查询结果即 \(B \mathop{\bowtie}\limits_{B.cno = C.cno} C\)
参考答案: 令 \(M := L, N := L\)
① 在每一门课程中,查询不是历史最高成绩的成绩
\[R1(cno, score) := \pi_{M.cno, M.score}(\sigma_{M.cno = N.cno \land M.score < N.score}(M \times N))\]② 查询每一门课程的历史最高成绩:
\[\text{highest}(cno, max\_score) := \pi_{cno, score}(L) - R1\]③ 在每一门课程中,查询不是历史最低成绩的成绩
\[R2(cno, score) := \pi_{N.cno, N.score}(\sigma_{M.cno = N.cno \land M.score > N.score}(M \times N))\]④ 查询每一门课程的历史最低成绩:
\[\text{lowest}(cno, min\_score) := \pi_{cno, score}(L) - R2\]⑤ 查询每一门课程的课程号、课程历史最高成绩和最低成绩:
\[\text{highest} \bowtie \text{lowest}\]使用新关系 \(R(A_1,A_2)\) 的方式重命名属性
标题:DB2602 - 关系代数的应用
作者:Zwing
创建于:2026-08-08 18:56:00
更新于:2026-08-08 12:06:24
链接:https://zanytriumph.github.io/posts/数据库作业-2.html
版权声明:本文章采用 CC BY-NC-SA 4.0 进行许可