一、前言
在数据库中的关系代数部分知识点的时候,会有一个初学者很容易犯的错误,包括博主本人第一次在做的时候也踩坑了,所以分享给各位小伙伴,避免出现类似情况,如果忘记了知识点的话,可以回顾一下这篇文章【关系模型知识点总结(3)—— 关系操作中的关系代数(含题目及详细分析)】
二、题目
Customer
客户编号(cid) | 姓名(cname) | 性别(csex) | 地址(caddress) | 邮编(czip) | 电话(ctel) | 年龄(cage) |
44000001 | 李琦 | 女 | 上海市黄浦区南京路1号 | 200001 | 13818893456 | 20 |
44000002 | 张岩 | 男 | 上海市浦东新区石桥路28弄 | 200120 | 13310174456 | 30 |
44000003 | 陈冬 | 男 | 广州市越秀区北京路186号 | 510030 | 13925056669 | 22 |
44000004 | 刘敏 | 女 | 广州市越秀区八旗二马路68号 | 510115 | 13802297825 | 27 |
Orders
订单编号(oid) | 客户编号(cid) | 商品编号(gid) | 订购金额(oamount) | 订购数量(osum) | 订购日期(orderdate) |
1 | 44000001 | 15020001 | 280 | 8 | 2022-9-12 |
1 | 44000002 | 15010001 | 149999 | 2 | 2022-9-12 |
1 | 44000002 | 15020001 | 9999 | 3 | 2022-9-25 |
1 | 44000003 | 15030001 | 299 | 4 | 2022-9-30 |
1 | 44000005 | 15010002 | 6999 | 3 | 2022-10-5 |
Goods
商品编号(gid) | 商品名称(gname) | 商品类型(gtype) | 型号(model) | 库存量(gstock) | 单价(gprice) |
15010001 | lv包包 | 奢侈品 | 人造皮革 | 10 | 149999 |
15010002 | 格力空调 | 家用电器 | 两匹半 | 42 | 6999 |
15020001 | 西门子冰箱 | 家用电器 | 630立升 | 3 | 9999 |
15030001 | 口红 | 化妆品 | 色号999 | 色号999 | 79 |
根据Customer,Orders,Goods三个关系,用关系代数表达式表示:查询客户“张岩”购买的商品名称及购买数量
三、解题思路
1.在customer表中找到并提取张岩的客户编号(cid)
这里需要先提取出来张岩这一行(选择),然后将代表他客户编号的列提取出来,与下一张表组成新的表,即自然连接Orders表,以便在第二张Orders表中通过cid提取出它的gid并组成新的表,即 投影
- σcname=‘张岩’(Customers)
- Πcid( σcname=‘张岩’(Customers))
2.将提取出来的cid与Orders表连接后提取商品编号(gid)
这里使用自然连接并投影
- Πcid( σcname=‘张岩’(Customers))⋈ Orders
- Πcid、gid( σcname=‘张岩’(Customers))⋈ Orders
3.连接Goods表后提取出订购数量(osum)和商品名称(gname)并组成新表
同样地,自然连接 后 投影
- Πcid、gid( σcname=‘张岩’(Customers))⋈ Orders ⋈ Goods
- Πosum、gname(Πcid、gid( σcname=‘张岩’(Customers))⋈ Orders ⋈ Goods)
四、易错点
这里的易错点在于当我们第一步提取出来cid以后,想到如果在Orders表周末和找到一个cid=提取出来的cid的元组,不就能再提取出来它的osum和gid,投影形成新的表了吗?同样的操作提取出来gname和gid投影形成新的表,两表一连接就完事儿了
但是有个致命的错误:提取出来的属性形成的是一个只含一个元素的表,不能等于一个值
Πcid( σcname=‘张岩’(Customers))的结果如下:
客户编号(cid) |
44000002 |
所以不能出现类似 cid = Πcid( σcname=‘张岩’(Customers))的操作
五、其它注意事项
- 当我们运用选择的运算时,如果出现两个及以上的条件,要用∧来连接
- 不可以用逗号隔开
例如:
要选择一个年龄大于20岁且是男性的客户,应该这么写:σcage>20∧csex=‘男’(Customer)
六、结语
本文的例题需要读者先自己做一遍,体会一下过程再看详细解答,有任何问题欢迎评论留言