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\)

\[\pi_{aid,ordno,orddate}(O) - \pi_{M.aid,M.ordno,M.orddate}(\sigma_{M.aid=N.aid \wedge M.ordno < N.ordno}(M\times N))\]

课件强调减数必须是投影出关系 \(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\)

\[\pi_{city,aid}(A) - \pi_{M.city,M.aid}(\sigma_{M.city=N.city \wedge M.percent < N.percent}(M\times N))\]

标题: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 进行许可