已知关系R(X,Y)
X | Y |
---|---|
X1 | Y1 |
X2 | Y2 |
X2 | Y3 |
X2 | Y1 |
和关系S(Y,F)
Y | F |
---|---|
Y1 | F1 |
Y2 | F3 |
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
X | Y |
---|---|
X1 | Y1 |
X | Y |
---|---|
X2 | Y1 Y2 Y3 |
对比即可发现:
X1的像集只有Y1,不能包含关系S中属性Y的所有值,所以排除掉X1;
而X2的像集包含了关系S中属性Y的所有值,所以R÷S的最终结果就是X2
例题
S:学生信息表
SNO | SNAME | AGE | SEX |
---|---|---|---|
1 | 李强 | 23 | 男 |
2 | 刘丽 | 22 | 女 |
5 | 张友 | 22 | 男 |
SC:学生选课成绩表
SNO | CNO | GRADE |
---|---|---|
1 | K1 | 83 |
2 | K1 | 85 |
5 | K1 | 92 |
2 | K5 | 90 |
5 | K5 | 84 |
5 | K8 | 80 |
C:课程信息表
CNO(课号) | CNAME(课名) | TEACHER |
---|---|---|
k1 | C语言 | 王华 |
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));