SQL 2:关系数据库


数据库2、关系数据库

一、关系数据结构

1、关系

关系、就是表。一张扁平的二维表

  • 单一的数据结构——关系

显示时间的实体以及实体之间的各种联系军用关系来标识

  • 逻辑结构——二维表

从用户角度来说,关系模型中数据的逻辑结构是一张二维表

1): 域 domain

域是一组具有相同数据类型的值的集合

自然数、证书、实数、男女性别、指定长度的字符串集合……都是域

2): 笛卡尔积 cartesian product

给一组域$D_1 D_2 … D_n$,每个D就是一个集合。

  • 所有域的所有取值的一个组合
  • 不能重复

这些域的笛卡尔积可以列成一张二维表,其数学语言如下:
$$
D_1\times D_2\times \cdots \times D_n\
={(d_1,d_2,\cdots,d_n)|d_i\in D_i,i=1,2,\cdots,n}
$$
其中,每一个元素$(d_1,d_2,\cdots,d_n)$叫做一个n元组(n tuple),可以简称为元组

元素中每一个值di叫做一个分量(component)

一个域允许的不同取值个数称为这个域的基数(Cardinal number)

如果$D_i (i=1,2,\cdots,n)$为有限集,基数$m_i (i=1,2,\cdots,n)$,则$D_1\times D_2\times \cdots \times D_n$的基数M为:
$$
M = \sum^{n}_{i=1}m_i
$$

是不是有点看晕了?举个例子🌰 就能看懂了:

这里列三个域

D1=导师={老刘,老陈}

D2=专业={人工智能,软件工程}

D3=学生={小刘,小陈}

D1xD2xD3的笛卡尔积就可以列为一张表:

导师 专业
老刘 人工智能 小刘
老刘 人工智能 小陈
老刘 软件工程 小刘
老刘 软件工程 小陈
老陈 人工智能 小刘宝
老陈 人工智能 小陈
老陈 软件工程 小刘
老陈 软件工程 小陈

该笛卡尔积的基数为2x2x2=8,也就是说,这个笛卡尔积一共有8个元组。

老陈、人工智能、软件工程、小刘……就是分量

3): 关系 relation

(1) 关系

$D_1\times D_2\times \cdots \times D_n$的子集叫做在域D1,D2,…,Dn上的关系,表示为 R(D1,D2,…,Dn)

这里R表示关系的名字,n是关系的目或度(degree)

(2) 元组

关系中的每个元素是关系中的元组,通常用t表示

  • n=1时,该关系为一元关系或单元关系(unary relation)
  • n=2时,该关系为二元关系(binary relation)

关系是笛卡尔积的有限子集,所以关系也是一张二维表

  • 表的每一行对应一个元组
  • 表的每一列对应一个域
(3) 属性

因为域可以相同,为了区分,给列起个新名字:属性(attribute)

n目关系必有n个属性

(4) 码
  • 候选码 Candidate key

    若关系中的某一属性组的值能唯一的表示一个元组(其子集不能),就称该属性为那个组的候选码

    • 简单的情况:候选码只包含一个属性
  • 全码 ALL-key

    最极端的情况:关系模式的所有属性组是这个关系模式的候选码,称为全码

  • 主码

    若一个关系有多个候选码,则选定其中一个为主码(Primary key)

    候选码的诸属性称为主属性(prime attribute)

    不包含在任何候选码中的属性称为非主属性(Non-Prime attribute)

    D1,D2,…,Dn的笛卡尔积的某个自己才有实际含义

    eg: 笛卡尔积介绍部分的表格,并没有实际的意义,取出有实际意义的元组来构造关系

    设关系SAP(supervisor,speciality,postgraduate),

    supervisor speciality postgraduate
    老刘 人工智能 小刘
    老陈 软件工程 小陈

    由于这里的程序我们假定人名为不会重名,所以postgraduate属性的每一个值都唯一标识了一个元组,因此可以作为SAP关系的主码。

(5) 三类关系
  • 基本关系(基本表或基表)

    实际存在的表,是实际存储的逻辑表示

  • 查询表

    查询对应结果的表

  • 视图表

    有基本表或其他试图表导出的表,是虚表,不对应实际存储的数据


由于第二部分我们对笛卡尔积的定义,关系可以是一个无限集合。且由于组成笛卡尔积的域不满足交换律,当关系作为关系数据模型的数据结构时,需要给予如下的限定与扩充:

  1. 无限关系在数据库系统中是没有意义的,现拟定的关系数据模型中的关系必须是有限集合
  2. 通过为关系的每一个列附加一个属性名的方法,取消关系属性的有序性。

通过上述说明,基本关系有以下六条性质:

  • 列是同质的(homogeneous)

    每一列的分量是同一类型的数据,来自同个域

  • 不同的列可出自同一个域

    • 其中的每一列为一个属性
    • 不同的属性要给与不同的属性名
  • 任意两个元组的候选码不能取同个值

    也就是元组不能重复

  • 列的顺序无所谓,列的次序可以任意交换

  • 行的顺序无所谓,行的次序可以任意交换

  • 分量必须取原子值

    也就是每个分量都必须是不可分的数据项,是最基本的一条

2、关系模式

数据库中要区分。关系数据库中,关系模式是,关系是。关系模式是对关系的描述。

关系是元组的集合,因此:

  • 关系模式是这个元组集合的结构,包括:

    • 哪些属性构成
    • 属性来自于哪些域
    • 属性与域之间的映像关系。
  • 需要完整的约束条件

关系模式可以形式化地表示为:

R( U , D , DOM , F )

  • R 关系名

  • U 组成该关系的属性名集合

  • D U中属性所来自的域

  • DOM 属性向域的映像集合

  • F 属性间数据的依赖关系的集合

举个栗子🌰

  • 导师和研究生出自同一个域——人

  • 取不同的属性名,并在模式中说明他们分别出自哪个域(定义属性向域的映像)

    DOM(SUPERVISOR-PERSON)

    = DOM(POSTGRADUATE-PERSON)

    = PERSON


关系模式通常可以简单记为:

R(U) 或 R(A1,A2,…,An)

  • R 还是指关系名
  • A1,A2,…,An 属性名
  • 域名及属性向域的映像常常直接说嘛为属性的类型、长度

关系模式与关系

  • 关系模式:

    • 对关系的描述
    • 静态的、稳定的
  • 关系

    • 关系模式在某一时刻的状态或内容
    • 动态的、随时间不短变化的
  • 关系模式和关系往往统称为关系

    通常通过上下文加以区别

3、关系数据库

在一个给定的应用领域中,所有关系的集合构成一个关系数据库

  • 关系数据库模式,是对应关系数据库的描述

  • 关系模式在某一时刻对应的关系的集合,通常称为关系数据库

4、关系模型的存储结构

关系数据库的物理组织

  • 有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成。
  • 有的关系数据库管理系统从操作系统那申请若干个大的文件,自己划分文件空间、组织表、索引等存储结构,并进行存储管理

二、关系操作

常见的关系操作

  • 查询操作:选择、投影、连接、除、并、交、差、笛卡尔积
  • 数据更新:插入、删除、修改

关系操作的特点

  • 集合操作方式:操作的对象和结果都是结合,以此一集合的方式

关系代数语言

  • 用对关系的运算来表达查询要求
  • 代表:ISBL

关系演算语言:用谓词来表达查询要求

  • 元组关系演算语言
    • 谓词变元的基本对象是元组变量
    • 代表:APLHA、QUEL
  • 域关系演算语言
    • 谓词边关的基本对象是域变量
    • 代表:QBE

具有关系代数和关系演算双重特点的语言

  • 代表:SQL (Structured Query Language)

三、关系的完整性

实体完整性、参照完整性、用户定义的完整性都都必须满足才行

关系的三类完整性约束

  • 实体完整性和参照完整性
    • 关系模型必须满足的完整性约束条件称为关系的两个不变性,应该由关系系统自动支持
  • 用户定义的完整性
    • 应用领域需要遵循的约束条件,体现了具体领域中的语义约束

1、实体完整性

简单来说,就是主属性不能取空值

规则:实体完整性规则 Entity Integrity

  • 若属性A是基本关系R的主属性,则属性A不能取空值

  • 空值就是“不知道”,“不存在”或“无意义”的值

  • 说明:

    • 实体完整性规则是针对基本关系而言的。

      一个基本表通常对应现实时间的一个实体集

    • 现实世界中的实体是可以区分的,即他们具有某种唯一性标识。

    • 关系模型中以主码作为唯一性标识

    • 主码中的属性即主属性不能取空值

      主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,与第2点相矛盾,,因此这个规则称为实体完整性

2、参照完整性

1): 关系间的引用

在关系模型中实体及实体之间的联系都是用关系来描述的,自然存在着关系与关系间的引用。

举个栗子🌰

对于学生来说,学号就是唯一标识符,是主码

在班级中,班长对于学生是“外码”,引用了本关系的“学号”,且班长必须是确实存在的学生的学号

2): 外码

设F是基本关系R的一个或一组属性,但不是关系R的码,若F与基本关系S的主码Ks相对应,则称F是R的外码

说人话就是,数据库中如果一个关系中的一个属性是另一个关系中的主码,这个属性就是外码。

基本关系R称为参照关系

基本关系S称为被参照关系或目标关系

举个栗子🌰

学生关系的“专业号”与专业关系的主码“专业号”相对应

  • “专业号”属性是学生的外码

  • 专业关系是被参照关系,学生关系是参照关系

      graph LR
    a(学生关系) -->|专业号|b(专业关系)

3): 参照完整性规则

规则:若属性/属性组F是基本关系R的外码,它与基本关系S的主码Ks相对应(R和S可能是相同的),则对于R中每个元组在F上的值必须为以下其中之一:

  • 空值(F的每个属性值都为空值)
  • 等于S中某个元组的主码值

举个栗子🌰

学生关系中每个元组的 “专业号” 属性只取两类值

  • 空值,还没给这个学生分配专业
  • 非空值,这个值得是专业关系中某个“专业号”值,毕竟不可能给学生分配一个根本不存在的专业

3、用户定义的完整性

针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据 必须满足的语义要求。

例如要求某个属性必须去取唯一值,某个非主属性也不能取空值,某个属性的取值范围在0-100之间……

关系模型应提供定义和检验这类完整性的机制,以便用统一的、系统的方法来处理它们,而不需用程序来承担这个功能。

四、关系代数

关系代数是一种抽象的查询语言,它用对关系的运算来表达查询

关系代数

  • 运算对象是关系
  • 运算结果也为关系
  • 关系代数的运算符有两类
    • 集合运算符
    • 专门的关系运算符

传统的集合运算是从关系的 “水平” 方向(行的角度)进行的

专门的关系运算不仅涉及行、还涉及列

类别 运算符 含义
集合运算符
-
x 笛卡尔积
专门的关系运算符 σ 选择
π 投影
▷◁ 连接
÷

1、传统的集合运算

先规定R和S两个表:

  • 具有相同的目n(即两个关系都有n个属性)
  • 相应的属性取自同一个域
R A B C S A B C
a1 b1 c1 a1 b2 c2
a1 b2 c2 a1 b3 c2
a2 b2 c1 a2 b2 c1

R∪S

仍为n目关系
$$
R\cup S={t|t\in R\vee t\in S}
$$

R∪S A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
a1 b3 c2

R - S

R-S A B C
a1 b1 c1

R∩S

R∩S A B C
a1 b2 c2
a2 b2 c1

RxS

严格来说应该是广义的笛卡尔积

R:n目关系,k1个元组

S:m目关系,k2个元组

RxS

  • 列 (n+m)列元组的集合

    • 元组的前n列是关系R的一个元组
    • 后m列是关系S的一个元组
  • 行:k1 x k2个元组

    • $$
      R \times S = {\stackrel\frown{t_rt_s}|t_r\in R\wedge t_s\in S}
      $$

2、专门的关系运算

引入的记号:

  • (1) R,t∈R,t[Ai]

    设关系模式为R(A1,A2,…,An)

    关系设为R

    t∈R表示t是R的一个元组

    t[Ai]表示元组T中相应于属性Ai的一个分量

  • (2) A , t[A] , $\overline{A}$

    若$A={A_{1k},A_{2k},…,A_{ik}}$,其中$A_{1k},A_{2k},…,A_{ik}$是A1,A2,…,An中的一部分,则A称为属性列或属性组。

    $t[A]=(t[A_{i1}],t[A_{i2}],\cdots ,t[A_{ik}])$表示元组t在属性列上各个分量的集合

    $\overline{A}$表示A1,A2,…,An中去掉$A_{1k},A_{2k},…,A_{ik}$后剩下的属性组。

  • (3) $\stackrel\frown{t_rt_s}$

    R为n目关系,S为m目关系

    tr∈R,ts∈S, $\stackrel\frown{t_rt_s}$称为元组的连接

    $\stackrel\frown{t_rt_s}$是一个n+m列的元组,前n个分量为R中的一个n元组,后m个分量为S中的一个m元组

  • (4) 象集Zx

    给定一个关系R(X,Z),X和Z为属性组

    当t[X]=x时,x在R中的象集(Images Set)为:
    $$
    Z_x={t[Z]|t\in,t[X]=x}
    $$
    它表示R中属性组X上值为x的各个元组在Z上分量的集合

    举个栗子🌰、有个表R:

    x1 Z1
    x1 Z2
    x1 Z3
    x2 Z2
    x2 Z3
    x3 Z1
    x3 Z3
    • x1在R中的象集

      Zx1={Z1,Z2,Z3}

    • x2在R中的象集

      Zx2={Z2,Z3}

    • x3在R中的象集

      Zx3={Z1,Z3}

1): 选择

选择又称为限制(Restriction)

选择运算符的含义

  • 在关系R中选择满足给定条件的各个元组
    $$
    \sigma_F®={t|t\in R\wedge F(t)=‘True’}
    $$

  • F: 选择条件,是一个逻辑表达式,取值为 True 或 False

    • 基本形式是:X1 θ Y1
    • θ 表示比较运算符,可以是>、≥、<、≤、= ……
  • 选择运算是从行的角度进行运算

2): 投影

从R中选出若干属性列组成新的关系
$$
\Pi_A®={t[A]|t\in R}
$$
投影操作主要是从列的角度进行运算

投影后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)

可以看到,象集的本质是一次选择运算和一次投影运算。

3): 连接

连接也称为θ连接

连接运算中

  • 从两个关系的笛卡尔积中选取属性见满足一定条件的元组
    $$
    R \underset{A\theta B}{\Join}S={\stackrel\frown{t_rt_s}|t_r\in R \wedge t_S \in S\wedge t_r[A]\theta t_s[B]}
    $$
(1) 两种常用的连接运算
  • 等值连接(equijoin)

    • θ为 “=” 的连接运算,就称为等值运算

    • 从关系R和S的广义笛卡尔积中选取A、B属性相等的那些元组,表示方式为:
      $$
      R \underset{A\theta B}{\Join}S={\stackrel\frown{t_rt_s}|t_r\in R \wedge t_S \in S\wedge t_r[A]= t_s[B]}
      $$

  • 自然连接(Natureal join)

    • 自然连接是一种特殊的等值连接

      • 两个关系中进行比较的分量必须是相同的属性组
      • 在结果中重复的属性列要去掉
    • 自然连接的含义

      • R和S具有相同的属性组B
        $$
        R {\Join}S={\stackrel\frown{t_rt_s}[U-B]|t_r\in R \wedge t_S \in S\wedge t_r[B]= t_s[B]}
        $$

一般的连接操作是从行的角度进行运算

自然连接还需要取消重复列,所以是同时从行和列的角度进行运算

举个栗子🌰

话说我们举了好多个栗子,希望能够便于理解吧

DB-2-5.png

首先有两个表格,用Markdown画这种有点太麻烦了,直接用图吧

一般的连接$R \underset{C<E}{\Join}S$的结果如下,满足C<E即可连接:

等值连接$R \underset{R.B=S.B}{\Join}S$的结果如下,可以看到R表B值和S表B值相同才能连接

自然连接,重复的属性列就没有了。 上面的等值连接进行比较的都是B属性, 但还可以进行R.B = S.E等值连接, 而自然连接只能是同名属性组

DB-2-8.png

最后总结一下:

  1. 等值连接必须要有等值的条件,当条件不同时连接的结果也不相同,两个关系可以没有相同的属性列

  2. 自然连接必须要有相同的属性列才能进行,即等值连接之后要去除相同的属性列

(2) 悬浮元组(Dangling tuple)

两个关系R和S在做自然连接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。

(3) 外连接(Outer Join)
  • 如果把悬浮元组也保存在结果关系中,而在其他属性上填 空值(NULL),就叫做外连接
  • 左外连接:只保留左边关系R中的悬浮元组
  • 右外连接:只保留右边关系S中的悬浮元组

上面R和S生成的外连接表为:

左外连接与右外连接就分别如下(空缺元素就用NULL补上):

4): 除运算

给定关系R(X,Y)和S(Y,Z),其中X Y Z为属性组

  1. R中的Y & S中的Y可以由不同的属性名,但是要出自相同的域集

  2. R与S的除法运算得到一个新的关系P(X)

  3. P是R中满足下列条件的元组在X属性列上的投影

  4. 元组在X上分量x的象集Yx包含S在Y上投影的集合,记作:
    $$
    R \div S={t_r[X] | t_r\in R \wedge \Pi_Y(S)\subseteq Y_X}
    $$
    Yx: x在R中的象集,$x=t_r[X]$。


除运算是同时从行和列进行运算的

除法具体计算步骤:

  • 计算$\Pi_Y(S)$,将结果记为Sy
  • 计算$\Pi_X®$,将结果记为Rx
  • 遍历Rx中每一个元素a,计算a在关系R中的象集,得到Ya
  • 判断Sy是否为Ya的子集
    • 是:将a加入到结果中
    • 不是:遍历下一个元素

文章作者: 拓佑豪
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 拓佑豪 !
评论
  目录