R÷S
- 对于某个R关系中的X的某个具体值x映射到Y的集合,如果它包含关系S中Y的集合,那么这个x就会出现在结果集当中
举个例子
- R表示学生的选课信息,其中X表示学号,Y表示课程号
- S表示课程的信息,其中Y表示课程号,Z表示学分
- R
- S
现在我们要找出一部分学生的学号,他们选了所有的课
- R÷S ==> 选了所有课的学生(很显然,上面只有学号为1的学生选了所有的课)
结果如下
SQL实现
常见的方式就是用双重not exists来实现
SELECT DISTINCT R1.X
FROM R R1
WHERE NOT EXISTS(
SELECT *
FROM S
WHERE NOT EXISTS(
SELECT *
FROM R R2
WHERE R2.X = R1.X AND R2.Y = S.Y
)
);
简单分析一下
- 先对里面一层 not exists分析,其功能为对于某个学号的学生,求得该学生未选的课程列表
- 外层加上一个not exists,整个SQL的含义就是求没有未选课程的学生,换句话说,就是求选了所有课的学生
- 第一行的DISTINCT也是很有必要的,去除了重复的X,你可以试试,不加,看一下结果,会发现每一个结果都会出现S表中Y集合的大小那么多次