SQLServer中的除运算实例学习

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&pide;t={a,b}。

即结果为:

a
a
b

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

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

2)s中所有元组和t的笛卡尔积,形成的所有组合都要在r中。

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

例如:

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

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

  ∏jno,零件号 ( 零件供应商表)&pide;∏零件号(σ供应商号=’s1’ (零件供应商表) )

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

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

select 学号 from 成绩表 a where not exists(
  select 课程号 from 课程表 c where not exists(
    select *from 成绩表 b where a.学号=b.学号 and c.课程号=b.课程号
  )
)
(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐