SQL中除运算笔记

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

简单分析一下

  1. 先对里面一层 not exists分析,其功能为对于某个学号的学生,求得该学生未选的课程列表
  2. 外层加上一个not exists,整个SQL的含义就是求没有未选课程的学生,换句话说,就是求选了所有课的学生
  3. 第一行的DISTINCT也是很有必要的,去除了重复的X,你可以试试,不加,看一下结果,会发现每一个结果都会出现S表中Y集合的大小那么多次

 

你可能感兴趣的:(SQL)