【数据库系统原理】第五章 代数和逻辑查询语言:包、扩展操作符、关系逻辑、关系代数与Datalog

第五章 代数和逻辑查询语言

5.1 包 Multiset

包的定义

  • 定义:即多集, Multiset。同一个元组可以在关系中多次出现。

  • 使用包的优点:

    • 提高并操作和投影操作的效率。
    • 对聚合运算(SUM, COUNT等)有用(聚合运算不能使用集合方式,会产生逻辑错误)。

包上的关系操作

  • 包上的运算都允许运算之前和运算之后元组重复。

  • 注意事项:

    • 集合上的包操作
      如果对两个集合 R、S 进行基于包的交和差操作,其结果与集合方式运算一样。

    • 因为作为被处理对象的两个关系本身没有重复的元组,

      所以交或差之后结果中仍然没有重复元组

      但对两个集合 R 和 S,进行基于包的并操作,其操作结果可能不再是集合。

      • 注意:看清(答题)/声明(出题)是包方式还是集合方式
  • 关于包的的代数定律

    • 交换律:S ∪ R = R ∪ S。
  • 包上的关系操作:

    • 包的并、交、差

      设R和S是包,若元组t在R和S中分别出现m次和n次(这里的m和n可以是0),则:

      • R ∪ S的包并操作结果中:元组t出现 m+n 次;
      • R ∩ S的包交操作结果中:元组t出现 min (m, n) 次;
      • R - S的包差操作结果中:元组 t 出现 max(0, m-n) 次。
    • 包的投影操作

      和集合投影基本一致,但是不需要再去重。

    • 包的选择操作

    • 包的笛卡尔积
      在这里插入图片描述
      在这里插入图片描述

    • 包的连接

      • 自然连接

        在这里插入图片描述

      • θ 连接

        在这里插入图片描述

5.2 关系代数的扩展操作符

  1. 消除重复 δ ( R ) δ(R) δ(R)
    清除包中的重复元素


  2. 聚集操作 ( SUM, AVG, MAX|MIN, COUNT \text{SUM, AVG, MAX|MIN, COUNT} SUM, AVG, MAX|MIN, COUNT)
    独立于同一关系中的其它元组而对某些元组进行计数、求最大值、最小值、平均值等运算

    • SUM用来产生一列总和,得到的是一个数字值;
    • AVG用来产生一列平均值,结果也是数字值;
    • MAX和MIN当用于数字值列的时候,产生的分别是这一列中最大的和最小的值;当应用于字符列的时候产生是字典序的最大者和最小者
    • COUNT产生一列中的“值”的数目(并不一定指不同的值)。同样,COUNT应用于一个关系的任何属性时,产生的是这个关系的元组数,包括重复的元组。

  3. 分组 γ L ( R ) \gamma_L(R) γL(R)
    根据元组的值对他们在一个或多个属性上分组

    • 应用 γ γ γ 操作的关系的一个属性,R使用这个属性分组,称为分组属性;

      • 例如:图5-4 γ s t u d i o n a m e ( M o v i e s ) γ_{studioname}(Movies) γstudioname(Movies)

        studioName
        Disney
        Disney
        MGM
        MGM
    • 应用到关系的一个属性上的聚集操作符,可以使用箭头给聚集属性列命名;

      • 例如: γ s t u d i o n a m e , S U M ( l e n g t h ) → s u m O f L e n g t h ( M o v i e s ) γ_{studioname,SUM(length)\rightarrow sumOfLength}(Movies) γstudionameSUM(length)sumOfLength(Movies)

        studioNamesumOfLength
        Disney12345
        MGM54321
    • 应用的例子

      例5.23 对关系StarsIn( title, year, starName),查询至少出演了三部电影的影星,以及他们在电影中出现的最早年份。

      在这里插入图片描述
      在这里插入图片描述


  4. 排序 τ L ( R ) \tau_L(R) τL(R)
    根据一个或多个属性对关系的元组排序。

    • 表达式 τ L ( R ) τ_L(R) τL(R),其中R是关系,L 是 R 中的某些属性的列表。这个表达式表示的就是关系R的本身,只是结果中的所有元组是按L来排序的。
    • 设 L 是由 A 1 , A 2 , … , A n A_1,A_2,…,A_n A1,A2,,An 组成,那么 R 的元组就先按 A 1 A_1 A1 的值排序,对于 A 1 A_1 A1 属性相等的元组则按 A 2 A_2 A2 的值排序,依次类推。

  5. 扩展投影 π L ( R ) \pi_L(R) πL(R)

    • 扩展投影是在投影的基础上增加一些计算操作作为投影列表;
    • 投影列表可以是:
      • 关系R的一个属性;
      • 形如x→y的表达式:将R中的属性x重命名为y;
      • 形如E→z的表达式,其中E是一个涉及R的属性、常量、算术运算符或者串运符表达式,z是表达式E计算结果的属性的新名字。

  6. 外连接运算 ⟗ , ⟕ , ⟖ ⟗, ⟕, ⟖ ,,
    连接运算的变体,悬浮元组的出现

    • 外连接的定义

      先计算两个关系 R 和 S 的自然连接,

      然后再把来自 R 或 S 的悬浮元组加入其中,用null 的表示符号补齐结果元组中那些不具有值的属性。

    • 外连接的不同变体

      在这里插入图片描述

      例:

      在这里插入图片描述

5.3 关系逻辑

Datalog 语言

  • Datalog 语言使用if-then规则来表示查询,即可以通过已知的关系中的某些元组的组合来推断查询结果。

  • Datalog 语言包括两种基本的原子,即关系原子算术原子,由原子按照一定的规则组成 Datalog 查询语句。

    • 在 Datalog 语言中,关系通过 “谓词” 来表示,每一个谓词都有固定数量的参数,写为 P ( x 1 , x 2 , … , x n ) P(x_1,x_2,…,x_n) P(x1x2xn),本质上谓词是一个返回布尔值的函数。

      • 假如 R 是包含 n 个属性 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1a2an 的关系,

        那么当元组 ( t 1 , t 2 , … , t n ) (t_1,t_2,…,t_n) (t1t2tn) 在关系 R 中,则 R ( t 1 , t 2 , … , t n ) R(t_1,t_2,…,t_n) R(t1t2tn) 为真,否则为假。

      • 此外,可以使用变量作为谓词的参数。

        例:

        AB
        12
        34

        例如若定义R(x,y),则当 x=1且y=2, 或者x=3且y=4时,R为真,否则为假。

        若定义R(1,z),则当z=2时,R为真,否则为假。

基本结构

  • 算术原子

    两个算术表达式的比较,值为布尔值。

    x < y x < y x<y

    x + 1 > y + 5 × z x + 1\gt y + 5\times z x+1>y+5×z

  • 扩展谓词和内涵谓词

    • 扩展谓词(EDB)

      若谓词所指的关系存储在数据库中,称该谓词为扩展谓词(EDB),对应于关系代数表达式中的操作数。

    • 内涵谓词(IDB)

      当谓词所指的关系是通过一个或多个 Datalog 规则计算得到的,称该谓词是内涵谓词,对应于使用关系代数表达式计算得到的关系。

规则

一般规则
  • 规则是Datalog语言中描述原子之间关联的规范,包括下列三个组成部分:

    1. 一个称为头部的关系原子;
    2. 左向箭头符号←,读作if;
    3. 主体部分,由一个或多个称为子目标的原子组成。
  • 子目标既可以是关系原子,也可以是算术原子。

    各个子目标之间用逻辑运算符AND连接,且各个子目标前面可以有NOT取反运算符。
    例如: L o n g M o v i e ( t , y ) ← M o v i e s ( t , y , l , g , s , p )   A N D   l ≥ 100 LongMovie(t,y)←Movies(t,y,l,g,s,p)\space AND \space l ≥100 LongMovie(t,y)Movies(t,y,l,g,s,p) AND l100

  • 规则的目标:使头部关系原子为真。

安全规则
  • 由于关系实例总是有限,所以还需要由规则保证得到的头部关系也都是有限的。

    • 每个在规则中任意位置出现的变量都必须出现在 主体的某些非否定的关系子目标 中。

    • 尤其是任何在规则头部、否定关系子目标、算术子目标中出现的变量,也必须出现在主体的非否定的关系子目标中。

    • 例:

      违反安全原则的示例: P(x,y)←Q(x,z) AND NOT R(w,x,z) AND x<y


5.4 关系代数与Datalog

集合运算 -> Datalog 规则

交集运算
  • 可以使用一个Datalog规则来表示

  • 由于交集运算涉及了两个关系,那么在Datalog规则中,具有与两个关系对应的子目标;

  • 在规则中,相应的参数使用相同的变量。

  • 例:

    假设R和S的关系模式是R(A,B,C)和S(A,B,C),

    则R∩S可以使用规则:
    I(a, b, c) ← R(a, b, c) AND S(a, b, c)

并集运算
  • 每个规则对应一个并集运算中的关系,且两个规则的头部都有相同的IDB谓词;

    头部的参数与各个子目标中的参数完全相同。

  • 例:

    假设R和S的关系模式是R(A,B,C)和S(A,B,C),
    则R ∪ S可以使用规则:
    U(x, y, z) ← R(x, y, z)
    U(x, y, z) ← S(x, y, z) {或U(a, b, c) ← S(a, b, c)}

  • 注意:

    变量名对于规则是局部的,即每条规则是独立计算的,并且向其头部关系提供元组,与其他规则无关,因此变量名是独立于规则的。

差集运算
  • 可以使用具有求反子目标的一个规则来计算

    • 即如果计算U-V,非求反子目标是谓词U,求反子目标是谓词V;
    • 在该规则中,子目标和头部对于相应的参数都有相同的变量。
  • 例:

    假设R和S的关系模式是R(A,B,C)和S(A,B,C),

    则R-S可以使用规则:
    D(x, y, z) ← R(x, y, z) AND NOT S(x, y, z)

投影运算
  • 使用一个具有单一子目标的规则,该子目标的参数是不同的变量,每个变量代表关系的一个属性;

  • 头部是带有参数的原子,其参数按照期望顺序对应于投影列表的属性。

  • 例:

    例5.25 将关系Movies (title, year, length, genre, studioName, producerC#)投影到前三个属性:
    P(t, y, l) ← Movies(t, y, l, g, s, p)

选择运算
  • 如果选择条件是一个或多个算术比较表达式的 AND 运算,可以建立一个具有下列子目标的 Datalog 规则:

    • 一个关系子目标,对应于将其进行选择的关系。该关系子目标的每个分量都有不同的变量,且每个分量都对应关系的一个属性;
    • 多个算术子目标,每个算术子目标对应选择条件的一个比较运算。在算术子目标中使用相应的变量,并且与关系子目标中建立的变量保持一致。
  • 例:

    S(t,y,l,g,s,p) ← Movies(t,y,l,g,s,p) AND l≥ 100 AND s=‘Fox’

笛卡尔积
  • R×S可以使用单一的Datalog规则来表示
    • 规则包含两个子目标分别对应R和S,两个子目标设置不同的变量与属性相对应。
    • 头部IDB谓词包含所有子目标中出现的参数,R子目标中的变量列在S的变量前面
      p(a,b,c,x,y,z) ← R(a,b,c) AND S(x,y,z)
连接运算
  • 自然连接 ( R ⋈ S {R}\bowtie{S} RS

    • 使用一条近似于笛卡尔积的 Datalog 规则来表示,区别在于 R 和 S 的公共属性列使用相同的变量,否则使用不同的变量。

    • 规则头部是一个IDB谓词,它的每个变量出现一次。

    • 例:

      假设R和S的关系模式是R(A,B)和S(B,C,D),

      则自然连接 R ⋈ S {R}\bowtie{S} RS 可以用规则
      J(a,b,c,d) ← R(a,b) AND S(b,c,d)

  • θ连接

    • 先对笛卡尔积进行转化,再对选择条件进行转化。
多重运算
  • 模拟多重运算的步骤如下:

    • 绘制关系代数的表达式树;

    • 表达式树的叶子节点由相应的扩展谓词EDB表示;

    • 为表达式树的每一个内部节点建立一个IDB谓词。IDB谓词的一条或多条规则对应树节点上需要使用的算子。

    • 与表达式树的根相关联的谓词关系对应于查询结果。

    • 例:

      在这里插入图片描述


包 -> Datalog 规则

  • 关系代数和 Datalog 规则都可以运用于包运算。

  • 将 Datalog 规则应用于包时,其运算步骤如下:

    • 第一步,对不同子目标对应的关系进行包连接运算;

    • 第二步,按照算术子目标包含的内容,对连接运算的结果进行包选择运算;

    • 第三步,把选择结果按照规则头部的关系进行包投影运算。

    • 例:

      π x , z ( R ( x , y ) ⋈ S ( y , z ) ) \pi_{x,z}( R(x,y) \bowtie S(y,z)) πx,z(R(x,y)S(y,z))
      H(x,z) ← R(x,y) AND S(y,z)

Datalog 规则和关系代数的比较

  • 基本关系代数的每一种操作都可以用Datalog查询表达,但扩展关系代数中的分组和聚集等操作无法用规则表达。
  • 任何单个Datalog规则都可以用关系代数表达,但Datalog可以表达递归,而关系代数不能。
    • 由于IDB谓词也可以在主体中出现,于是规则头部的元组可以反馈到规则主体,从而为头部生成更多的元组。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值