DB2601 - 关系代数基本运算的应用
设有一个公司产品零售数据库,其关系模式如下(带下划线的属性是各个关系的码)
| 关系名 | 属性集 | 关系模式 |
|---|---|---|
| 顾客 | 顾客编号, 姓名, 居住城市, 折扣 | C (cid, cname, city, discnt) |
| 供应商 | 供应商编号, 名称, 所在城市, 佣金比例 | A (aid, aname, city, percent) |
| 商品 | 商品编号, 名称, 仓库所在城市, 库存数量, 单价 | P (pid, pname, city, quantity, price) |
| 订单 | 订单编号, 订单日期, 顾客编号, 供应商编号, 商品编号, 订购数量, 销售金额 | O (ordno, orddate, cid, aid, pid, qty, dollars) |
仅允许使用关系代数的基本运算,请写出下述查询对应的关系代数表达式
1.查询满足下述条件的商品的编号和名称:仓库位于苏州市且库存数量低于1000;
\[\pi_{pid,pname}(\sigma_{city='苏州市' \wedge quantity<1000}(P))\]
2.查询满足下述条件的订单,结果返回订单编号、顾客所在城市、供应商所在城市:订单上的顾客和供应商不在同一个城市中;
\[\pi_{O.ordno,C.city,A.city}(\sigma_{O.cid=C.cid \wedge O.aid=A.aid \wedge C.city \neq A.city}(O\times C\times A))\]
3.查询满足下述条件的供应商的编号和姓名:只向苏州市的顾客销售过商品;
\[\pi_{A.aid,A.aname}(\sigma_{O.aid=A.aid \wedge O.cid=C.cid}(O\times A\times C)) - \pi_{A.aid,A.aname}(\sigma_{O.aid=A.aid \wedge O.cid=C.cid \wedge C.city \neq '苏州市'}(O\times A\times C))\]
课件参考答案 1:
\[\pi_{A.aid,A.aname}(\sigma_{O.aid=A.aid \wedge O.cid=C.cid \wedge C.city = '苏州市'}(O\times A\times C)) - \pi_{A.aid,A.aname}(\sigma_{O.aid=A.aid \wedge O.cid=C.cid \wedge C.city \neq '苏州市'}(O\times A\times C))\]课件参考答案 2:
\[\pi_{A.aid,A.aname}(\sigma_{O.aid=A.aid}(O\times A)) - \pi_{A.aid,A.aname}(\sigma_{O.aid=A.aid \wedge O.cid=C.cid \wedge C.city \neq '苏州市'}(O\times A\times C))\]被减数关系 “向苏州市的顾客销售过商品的供应商的编号和名称” 可简化为 “销售过商品的供应商的编号和名称”,而提交的答案是中间态
4.查询满足下述条件的供应商的编号和姓名:该供应商所有订单的销售金额都不低于1000;
\[\pi_{A.aid,A.aname}(\sigma_{O.aid=A.aid}(O\times A)) - \pi_{A.aid,A.aname}(\sigma_{O.aid=A.aid \wedge O.dollars<1000}(O\times A))\]
5.查询每一位供应商的最后一份订单,结果返回供应商编号、最后一份订单的订单编号和日期。(不考虑没有订单的供应商;以订单编号的大小区分订单的先后,编号大的订单在后)
令 \(S := O\)
\[\pi_{aid,ordno,orddate}(O) - \pi_{O.aid,O.ordno,O.orddate}(\sigma_{O.aid=S.aid \wedge O.ordno < S.ordno}(O\times S))\]
令 \(M := O, N := O\)
课件强调减数必须是投影出关系 \(M\) 的属性,即 \(\pi_{M.aid,M.ordno,M.orddate}(...)\)
01班:
| 关系名 | 属性集 | 关系模式 |
|---|---|---|
| 顾客 | 顾客编号, 姓名, 居住城市, 折扣 | C (cid, cname, city, discnt) |
| 供应商 | 供应商编号, 名称, 所在城市, 佣金比例 | A (aid, aname, city, percent) |
| 商品 | 商品编号, 名称, 仓库所在城市, 库存数量, 单价 | P (pid, pname, city, quantity, price) |
| 订单 | 订单编号, 订单日期, 顾客编号, 供应商编号, 商品编号, 订购数量, 销售金额 | O (ordno, orddate, cid, aid, pid, qty, dollars) |
2.查询满足下述条件的订单的编号和销售金额:上海市的顾客通过位于苏州市的供应商购买商品;
\[\pi_{O.ordno,O.dollars}(\sigma_{O.cid=C.cid \wedge O.aid=A.aid \wedge C.city='上海市' \wedge A.city='苏州市'}(O\times C\times A))\]
3.查询没有购买过商品的顾客的编号和姓名;
\[\pi_{cid,cname}(C) - \pi_{C.cid,C.cname}(\sigma_{O.cid=C.cid}(O\times C))\]
4.查询满足下述条件的顾客和供应商:他们位于同一座城市中但相互之间不存在销售订单,结果返回顾客的编号、供应商的编号、他们所在城市的名称;
\[\pi_{C.cid,A.aid,C.city}(\sigma_{C.city=A.city}(C\times A)) - \pi_{C.cid,A.aid,C.city}(\sigma_{C.city=A.city\wedge C.cid=O.cid\wedge A.aid=O.aid}(C\times A\times O))\]
课件参考答案 2:
\[\pi_{C.cid,A.aid,C.city}(\sigma_{C.city=A.city}(C\times A)) - \pi_{O.cid,O.aid,A.city}(\sigma_{A.aid=O.aid}(A\times O))\]
5.对于每一座城市,在位于该城市的所有供应商中,查询佣金比例最高的供应商,结果返回城市名称、该城市中佣金比例最高的供应商的编号。(不需要考虑,没有供应商的城市)
令 \(S := A\)
\[\pi_{city,aid}(A) - \pi_{A.city,A.aid}(\sigma_{A.city=S.city \wedge A.percent < S.percent}(A\times S))\]
令 \(M := A, N := A\)
标题:DB2601 - 关系代数基本运算的应用
作者:Zwing
创建于:2026-08-08 18:57:00
更新于:2026-08-08 12:06:24
链接:https://zanytriumph.github.io/posts/数据库作业-1.html
版权声明:本文章采用 CC BY-NC-SA 4.0 进行许可