频道栏目
首页 > 资讯 > SQL Server > 正文

SQLServer中的除运算实例学习

18-06-12        来源:[db:作者]  
收藏   我要投稿

SQL Server中的运算有并,交,差,笛卡尔积,除运算,其中笛卡尔积是最费时间的。除运算个人感觉是最难理解的,所以,花了点时间整理以下除运算方便以后查。

例如,有以下R表,S表,T表

这里写图片描述

当我们计算R除以T时:(不区分大小写)

先找出R表中和T表相同的属性,这里是B和C。

也就是说R表中的其他属性A可以取值为{a,b,c}

其中, a的象集为{(b,c),(d,e)},b的象集为{(b,c),(d,e)},c的象集为{(a,b)}

而T在B和C上的投影为S{(b,c),(d,e)},这时候,我们在步骤三中找一个象集是包含S集合的,即a,b的象集包含了T在B,C

属性组上的投影,所以R÷T={a,b}。

即结果为:

A
a
b

通过分析结果,我们不难发现其实,除运算就是要我们找到这样的一个集合S,使得S中所有属性及其值:

1)是包含所有在R中但不能包含在T中的属性和值。

2)S中所有元组和T的笛卡尔积,形成的所有组合都要在R中。

在我们实际中,大多数情况是用在出现这种字眼的查询:都,全部,至少等等。

例如:

1)查询选修了所有课程的学生的学号:∏学号,课程号(成绩表)÷ ∏课程号(课程表 )

2)查询至少用了供应商S1所供应的全部零件的工程号JNO:

  ∏jno,零件号 ( 零件供应商表)÷∏零件号(σ供应商号=’S1’ (零件供应商表) )

SQL语句的表示通常是用not exists表示,且not exist还嵌套另一not exists语句。

如:1)查询选修了所有课程的学生的学号:∏学号,课程号(成绩表)÷ ∏课程号(课程表 )

select 学号 from 成绩表 a where not exists(
  select 课程号 from 课程表 c where not exists(
    select *from 成绩表 b where a.学号=b.学号 and c.课程号=b.课程号
  )
)
相关TAG标签
上一篇:MySQL存储引擎以及MyISAM与InnoDB的区别详解
下一篇:关于SQLServer事务隔离级别控制知识探讨
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站