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集合的大小那么多次

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值