跳到主要内容

4.1 关系代数

4.1.1 集合运算符

集合运算符包括:

运算符含义SQL用途
\cupUNION(去重)、UNION ALL(不去重)两个集合的并集
-EXCEPT前者去掉后者的元素
\capINTERSECT两个集合共有的元素
×\times笛卡尔集CROSS JOIN两个集合的所有元素排列组合

4.1.2 专门的关系运算

运算符含义关系代数语法用途
σ\sigma选择σ条件1,条件2...(R)\sigma_{\text{条件1,条件2...}}(R)按条件筛选记录
π\pi投影π列1,列2...(R)\pi_{\text{列1,列2...}}(R)选择某列
\bowtie连接RSR \bowtie S(自然连接)
R条件1,条件2...SR \bowtie_{\text{条件1,条件2...}} S(等值连接)
关联两个关系
÷\divR÷SR \div S找出所有与另一关系的每一行都有对应关系的元组

4.1.2.1 连接

连接分自然连接等值连接

设两个关系:

R(rid, x, y)
S(sid, x, z)
  • 等值连接:保留同名列,并在结果中用表名作前缀区分
RS=RS(rid,sid,R.x,S.x,y,z)R \bowtie S=RS(rid, sid, R.x, S.x, y, z)
  • 自然连接:按指定条件匹配,相同列只保留一次

    RR.x=S.xS=RS(rid,sid,x,y,z)R \bowtie_{\text{R.x=S.x}} S=RS(rid, sid, x, y, z)

4.1.2.2 除

计算步骤如下:

  • 找出 R 和 S 相同的列(假设是 C 列);
  • R 中去掉 C 列的其余列,按剩余列分组;
  • 对每一组,检查 C 列的值集合是否 包含 S 的所有值且数量相等;
  • 满足条件的组,把剩余列加入结果。

具体的,设两个关系:

  • R(name, pid)

    namepid
    张三P1
    张三P2
    李四P2
  • S(pid, platform)

    pidplatform
    P1A1
    P2A1

计算 R÷SR \div S

  1. 两个关系中相同名称的列有 pid

  2. RRpid 列去掉后去重,得到关系 RpRp

    name
    张三
    李四
  3. SS 仅保留 pid 列去掉后去重,得到关系 SpSp

    pid
    P1
    P2
  4. RR 按照上述结果分组,并去除列 pid,得到两组结果:

    • name=张三

      pid
      P1
      P2

      此结果与 SpSp 相同,则此行加入结果。

    • name=李四

      pid
      P2

      此结果与 SpSp 不同,跳过。

  5. 综上,计算结果为:

    name
    张三