商业DBMS实现的关系一般是基于包的
包(多集,multiset)不用去重
例:R,S是包,t在R中出现了n次,在S中出现了m次,则t在R-S中出现max{0,n-m}次
关系代数上增加的操作符
1.δ消重复
δ(R)
2.聚集操作符:对分好组的各列进行计算
SUM,AVG,MIN,MAX,COUNT
不操作空值
3.分组操作:根据属性进行分组 2+3->γ
γ{下标:starName,min(year)->minYear,count(title)->ctTitle}(StarsIn)
startName是分组属性
year,title是聚集属性
4.扩展投影:将变量关系的列作为参数进行计算,并产生新的列
π{下标L}(R)
L列表可以是以下1)R的属性2)x->y将x重命名为y显示在结果中3)E->z E是一个表达式
投影操作的结果是通过依次考虑R的每一个元组得到的
5.排序算子:把一个关系变成一个元组的列表,注意有些关系代数操作不能作用在列表上
默认升序
一般排序操作放最后
τ{下标表示 按照什么来排序:A1,A2……}(R)
如果其它操作符作用在排序的结果上,则排序的顺序是没有意义的,列表应被看作包,但投影和选择可以保持顺序
6.外连接算符:悬浮元组用null补齐,出现在结果中
悬浮元组:连接属性不能跟另外关系的任何一个元组的连接属性匹配
符号是连接符上价格圈,null的符号是⊥
左外连接(加个下标L):只有左变量的悬浮元组被加进来
右外连接(加个下标R):只有右变量的悬浮元组被加进来
加个下标C表示条件就是θ的外连接版本
关系逻辑
基于代数的抽象查询语言
逻辑查询语言Datalog由if-then规则组成
谓词:关系在Datalog中由谓词表示,每个谓词拥有固定数目的参数(算术比较符号也是谓词)
原子:一个谓词和它的参数一起被称为原子(关系原子)
例:P(x1,x2,……,xn)是由谓词P和参数x1到xn组成的原子
!!注意:谓词定义的关系是集合关系
算术原子:对两个算术表达式作比较
Datalog规则
rule:
LongMovie<—Movies(t,y,l,g,s,p) AND l≥100
等价于
LongMovie:=π{下标t,y}(σ{下标l≥100}(Movies))
1.一个称为头部的关系原子
2.符号<—读作if
3.主体部分,由一个或多个称为子目标的原子组成。原子可以是关系原子或算术原子。字母表之间由AND连接。任何字母表之前都可以添加逻辑算子NOT。
Datalog中的查询是一个或多个规则的组合
如果只有一个关系出现在规则头部,那么这个关系的值就是查询结果
若不止一个关系,则这些关系中的一个是查询的结果,其余都是辅助定义查询结果
通常指定Answer为查询结果名。
安全条件
使得一条规则的结果是一个有限的关系
每个在规则中任意位置出现的变量都必须出现在主体的某些非否定的关系子目标中
扩展谓词:这种谓词的关系存放在数据库中 EDB谓词
内涵谓词:这种谓词的关系是由一个或多个Datalog规则计算出来 IDB谓词
(规则头部不能是EDB)
Datalog规则也可应用于包
如果一个关系由若干规则定义,则结果是每个规则生成的元组的包的联合
关系代数与Datalog p136
每个关系代数算子都可以由一条或多条Datalog规则模拟
扩展关系代数操作不行,比如分组聚集
Datalog规则可以表达关系代数中不能表达的递归功能
or一般要改成多条规则
任何单个Datalog规则都可以用关系代数表示。但多个Datalog规则的集合就不一定,因为Datalog可以表达递归。
Datalog模拟多重操作
观察关系代数表达式的表达树,并对树的每个内部节点创建一个IDB谓词
网友评论