关系代数——除运算

已知关系R(X,Y)

XY
X1Y1
X2Y2
X2Y3
X2Y1

关系S(Y,F)

YF
Y1F1
Y2F3

R÷S其实就是判断关系R中X各个值的像集Y是否包含关系S中属性Y的所有值


第一步:找出关系R和关系S中相同的属性,即Y属性。在关系S中对Y做投影(即将Y列取出);所得结果如下

Y
Y1
Y2

第二步:被除关系R中与S中不相同的属性列是X ,关系R在属性(X)上做取消重复值的投影为{X1,X2};


第三步:求关系R中X属性对应的像集Y

XY
X1Y1
XY
X2Y1
Y2
Y3

对比即可发现:
X1的像集只有Y1,不能包含关系S中属性Y的所有值,所以排除掉X1;
而X2的像集包含了关系S中属性Y的所有值,所以R÷S的最终结果就是X2


例题

S:学生信息表

SNOSNAMEAGESEX
1李强23
2刘丽22
5张友22

SC:学生选课成绩表

SNOCNOGRADE
1K183
2K185
5K192
2K590
5K584
5K880

C:课程信息表

CNO(课号)CNAME(课名)TEACHER
k1C语言王华
k5数据库原理程军
k8编译原理程军

检索至少选修程军老师所授全部课程的学生姓名SNAME:
πSNAME(S⋈(πSNO,CNO(SC)÷πCNO(σTEACHER=“程军”(C ))))

检索选修全部课程的学生姓名:
πSNAME(S⋈(πSNO,CNO(SC)÷πCNO( C)))

检索选修课程包含学号为2的同学所修课程的学生学号:
πSNO,CNO(SC)÷πCNO(σSNO=“2”(SC))


将除运算用sql语句表示,可以使用NOT EXISTS
例如:检索至少选修程军老师所授全部课程的学生姓名SNAME,可以表达为,查询名字为X的学生,对所有的课程Y,只要是程军老师授课,则X选修了Y;等价转换为,不存在这样的课程Y,是程军老师授课,但学生X没有选修,SQL语言表示如下:

SELECT SNAME
FROM S
WHERE NOT EXISTS(SELECT *
				 FROM C
				 WHERE TEACHER='程军' AND NOT EXISTS(SELECT *
				 									 FROM SC
				 									 WHERE SC.SNO=S.SNO AND SC.CNO=C.CNO));

同理有检索选修课程包含学号为2的同学所修课程的学生学号,可以表达为,查询学号为X的学生,对所有的课程Y,只要学号为2的同学选修了课程Y,那么X也选修了课程Y;等价转换为,不存在这样的课程Y,学号为2的同学选修了Y,而学号X的同学没有选,SQL语言表示如下:

SELECT SNO
FROM S
WHERE NOT EXISTS(SELECT *
				 FROM SC A
				 WHERE SC.SNO='2' AND NOT EXISTS(SELECT *
				 								 FROM SC B
				 								 WHERE B.SNO=S.SNO AND B.CNO=A.CNO));
  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值