属性 lesson属性 name 语文 sam 语文 peter 语文 lucy 数学 sam 数学 lucy
英语
sam 英语 peter
name sam
这种情况下,S/S1的结果是什么呢答案如下
lesson 语文 数学 英语
再来一个列子
name sam peter
S/S2的结果是什么呢
lesson 语文 英语
最后一个例子
name sam peter lucy
答案相信大家已经知道答案了
lesson 语文
这是我能想到的一个应用除法最贴切的例子,就是怎么筛选出这几个同学都选过的课程呢?你要是不太懂得关系运算,这个查询可能做起来就很费尽,你可能会写一个N个同学嵌套的查询,但是要是求一个班同学的查询,那就嵌套了几十个select,那个效率明显不能满足我们的需求。(可能有的人还不知道怎么嵌套,说一说思路把,就是把一个同学所有选的课都选出来,然后和第二个同学对比,求出两个人公共的课程,再把结果和第三个人求公共课,以此类推,就可以求解出所有人公共选择的课程,说到这里大家有没有感觉到,这其实和编程的算法有点类似,刚刚的思路就是暴力求解,而我们的除法操作就是比较优秀的算法)
(3)思路以及通用公式
咱们还是以选课的例子来讲解除法的思路:
首先,我们得把学生,课程L,学生S和课程的一一对应L_S想象成三个集合,然后:
1.先把所有课程和学生作笛卡尔积得到LS(就是建立所有课程和所有学生一一对应的关系,通俗一点就是让每个学生选所有课程)
2.再把刚刚建立的新集合LS和L_S作减法(就是把两个集合作比较只留被减数LS所特有的元组),通俗的说就是找到那些我们期望的人没有同时选择的课。
2.然后吧这些课投影出来,再与之前所有课程做减法就得到了我们期望的结果
通用公式如下:
其中A相当于我们的大表S,而B相当与S2其中π操作为投影操作而x为投影条件。
(4)总结:
整个除法的抽象过程就是,先找到被除数那个大集合从中获取我们需要属性的全集,这个通常就是一个带distinct的查询就能解决,然后吧这个结果与除数的集合做笛卡尔积,然后再与原来的大集合做减法,这一步得到的就是那些不同时包含我们除数元组的期望属性,然后再与之前所求的所有属性做减,就得到我们期望的结果。这个过程的思想就是一个先求补集的思想,以为我们需要求同时包含这几项的另外一个属性值这就相当于逻辑与操作,直接做相对于复杂,我们把它转化为集合的运算过后,就容易多了。。
(5)除法运算在嵌套查询的应用:
一般来说嵌套查询就类似与我们平常编程的嵌套循环,算法分析的时候,往往嵌套越多相对应算法的性能就越差,因为当我们操作的集合足够大的时候这个时间会按幂函数增长,大到一定程度就会大大降低用户对于服务的体验。
应用场景:
要从一个大表里面找出同时包含所有我们检索到的多组元组的元组。
方法分析:有时候这个元组并不是包含一个属性,我们就假设有m个属性,而大表中有n个元组,小表有s个元组,同时我们期望的属性有K组通常K<=n,而m是远远小于n的,所以我们开始来分析两种查询的时间复杂度
嵌套:我们要为小表没一组元组对大表进行匹配这个过程的时间复杂度为:O(m*n),而下一步是进行嵌套就相当于做s次前面的匹配过程,时间复杂度为O((m*n)^s)。
然而对于我们的除法操作:
先找出K复杂度为O(n),而做笛卡尔积复杂度为O(K*s),而相减O(n*k*s)最后一个减法就可以忽略不计了,整体复杂度为O(n*k*s)
整体来说要是小集合只有一两组元组,那完全可以用嵌套查询,但是要什么四五六七八九,那个查询次数将成为天文数字,除法操作将成为不错的选择。
(6)除法操作的MySQL实现:
一般情况下使用这条语句就能实现整个过程,select distinct lesson from ( select distinct lesson from SS,S2) as all_les where not exists (select * from SS where all_les.lesson = lesson and all_les.name = name);
但是笛卡尔积过后的表是无法保存的,as all_les在mysql是无法识别的,所以这种方式是不可行的。所以只能先把所有的课选出来存在临时表中,
create temporary table les (select distinct lesson from SS);
然后再把笛卡尔积的结果放在另一张表中,
create temporary table all_les (select * from les,S2);
然后就可以进行除法操作了
select distinct lesson from all_les where not exists (select * from SS where all_les.lesson = lesson and all_les.name = name);
第一个是SS,就是我们之前提到的相关连的表即被除数,第二个S2即除数,第三个就是除法的结果,只有数学没有被sam和peter同时选择。数据库除法实现
1 关系
除法
概念
首先,SQL运算其实就是
集合
的运算,大体也就是投影(select),筛选(where),分组(group by,分组后的聚合和having筛选我们统一划分到分组),
集合
的加(union,也可以叫
集合
并运算),减(not in,not exists,minus等,也叫结合补预算,差运算),乘(inner join、left join等各种连接,也可以归结到结合交运算),除(貌似没...
设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,则T的原则与S的元组的所有组合都在R中。
用象集来定义
除法
:
给定关系R(X,Y)和S(Y,Z)。其中X,Y,Z为属性组。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域。
R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:元组在X上的分量值x的象集Yx包含S在Y上...
关系代数
运算1. 运算符分类2.
集合
操作运算符3. 专门的关系运算符3.1 σ( 选择 )3.2 π ( 投影 )3.3 ÷ ( 除 )3.4 连接3.4.1 连接、等值连接3.4.2 自然连接3.5 外连接(自然连接+失配元素)3.5.0 为何需要外连接3.5.1 左外连接(自然连接+左表失配元素)3.5.2 右外连接(自然连接+右表失配元素)3.5.3 全外连接(自然连接+左右表失配元素)
1. 运算符分类
集合
:并( U )、交( ∩ )、差( — )、笛卡尔积( × )
比较:大于( >)、小于(
当多表关联
查询
时,就是n个表中的n条数据,如果满足这n个关联条件,就会组成一条数据,作为本次
查询
的一条结果。而是一次
查询
指定条的数据(10,20),第一个几条数据,我们可以说第一页的数据。如果一个表的一条数据,在关联表中没有符合条件的数据,那么此条数据就不会被
查询
出来。副表如果和主表有关联数据,则会被
查询
出来,如果没有,全部以null值填充。表设计:添加一个关联表,表一般会有两个
字段
,分别是两个表的主键id。索引当你的
查询
速度慢的时候,你想到的第一件时间,就是为列添加索引。
复习时遇到的一个难点,理解了之后还是觉得做题太慢,所以自己想了一个觉得还比较高效的理解来做题。
首先,要用复杂
查询
来做的题都可以转换成包含两个否定的说法。
eg1:
查询
订购了所有产品的顾客的cid值
转换后:不存在一个产品用户没有订购。
eg2:
查询
被所有居住在New York的顾客订购的产品pid
转换后:不存在居住在New York的某位顾客没有订购的产品。
以eg1为例我们又可以把这两个否定给去掉,变成:存在一个产品用户订购了。
变成这个说法之后就很好用
除法
来做了
假设有一个orders表
用orde
让我们首先创建一个表-
mysql
>createtableDemoTable->(->IdintNOTNULLAUTO_INCREMENTPRIMARYKEY,->Numberint->);使用插入命令在表中插入一些记录-
mysql
>insertintoDemoTable(Number)values(10);
mysql
>...
二、
查询
表中列的注释信息
select * from information_schema.columnswhere table_schema = 'db' #表所在
数据库
and table_name = 'tablenam...
1.关系运算的分类(1)基本运算操作:并、差、笛卡尔积、投影和选择。(2)组合运算操作:交、联接、自然联接和除。另外,还有几种扩充的
关系代数
操作:外联接(左外联接和右外联接)、外部并和半联接。2.
除法
定义的理解设两个关系R和S的元数分别为r和s(r>s>0),那么R÷S是一个(r-s)元的元组的
集合
。(R÷S)是满足下列条件的最大关系,其中每个元组t与S中每个元组u组成的新元组必在关系...
并相容性的示例
STUDENT(SID char(10),Sname char(8),Age char(3))
PROFESSOR(PID char(10),Pname char(8),Age char(3))
两个关系是相容的.
并(Union)
定义:假设关系R和关系S是相容的,则关系R与关系S的并运算结果也是一个关系,...