SQL Server中的除运算

版权声明:欢迎转载评论~哈哈哈哈请标明出处呀 https://blog.csdn.net/legendaryhaha/article/details/80642248

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

例如,有以下R表,S表,T表
这里写图片描述

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

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

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

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

  4. 而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.课程号
  )
)

猜你喜欢

转载自blog.csdn.net/legendaryhaha/article/details/80642248
今日推荐