3 形式化关系查询语言
摘要:关系代数是一种抽象的查询语言,用对关系的运算来表达查询,作为研究关系数据语言的数学工具。在本文中,我们不仅谈论关系代数的知识点,而且还配备了对应的练习题。
文章目录
- 3 形式化关系查询语言
- 3.1 关系代数
- 3.1.1 概述
- 3.1.2 选择操作
- 3.1.3 投影操作
- 3.1.4 集合操作
- 3.1.4.1 笛卡尔乘积
- 3.1.4.2 并交差操作
- 3.1.5 连接操作
- 3.1.6 更名操作
- 3.1.7 除操作
- 3.1.8 外连接
- 3.1.9 外并操作
- 3.1.10 赋值操作
- 3.1.11 练习
3.1 关系代数
3.1.1 概述
说明:关系代数语言是一种过程化查询语言
,它包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。
关系代数一般包含五个基本操作,如果一个系统或者数据库产品包含这五个基本操作,那我们认为这个系统的功能是完备的
。
任何的操作都可以通过这五个操作来组合完成,如下所示:
操作名 | 英文 | 符号 |
---|---|---|
选择操作 | select operation | σσσ |
投影操作 | project operation | π |
笛卡尔乘积 | Cross product | × |
集合差操作 | Set - diffrent | − |
集合并操作 | union | ∪ |
选择投影和更名为一元运算
,因为它们只对一个关系进行操作;而另外三个对两个关系进行运算,故为二元运算。
。
事实上,目前流行的关系数据库中,除了满足关系完备性以外,还增加了不少关系代数所不支持的操作,如排序
、分组
、聚集函数
,甚至是传递闭包
的计算。
提示:需要注意的是,在一些书上关系代数也叫做关系代数操作,简称关系操作。在《数据库原书(第6版)》中,出现了更名
这一基本操作,但是在大多数的考试中,基本操作还是以上表为准。
在学习的过程中,对于考试我们不仅需要掌握关系代数符号,还需要掌握会写关系代数表达式。
3.1.2 选择操作
说明:选择操作就是加限制条件选元组,作用相当于SQL中的where子句。
提示:需要注意的是,基本操作都是支持多种运算的组合的,比如选择和投影和连接和集合运算一起使用,这都是可以的,但是要注意先后顺序,这在后面我们会给出演示。
3.1.3 投影操作
说明:投影就是选取关系中的某些列,即选取某些属性,作用相当于SQL中的select子句。
提示:
- 投影后的表由于有可能不包含候选键,这就会导致有些元组可能是重复的,这时候系统会自动消除重复元组,所得关系(表)的元组数小于原关系的元组数。如果投影后的表包含候选键,那么元组数和投影前一样。
- 在实际的数据库产品中,数据库投影后他是不会自动去重的,因为数据库他不能保证用户对重复的数据是否有应用价值,所以,除非你要求,不然他不会自动去重。
3.1.4 集合操作
3.1.4.1 笛卡尔乘积
说明:集合操作指的是并
、交
、差
和笛卡尔乘积
在表的连接查询方面有一种现象被称为:笛卡尔积现象(笛卡尔乘积现象)
,也就是说,你可以理解为两张表做笛卡尔乘积,等于两张表中所有元组两两匹配的所有结果,如图所示:
关系一有6条元组,关系二也是6条,那么做笛卡尔乘积,所得的关系就是36条元组。
当然,我们说的连接
,实际上就是加了条件的笛卡尔乘积。
3.1.4.2 并交差操作
说明:这个概念和我们数学中集合的概念是一样的,但是对于数据库来说,它会出现一些问题。
如果是以上的两张表做并操作,那么这是完全没有办法的,老师表中的属性和学生表的属性完全不一样,你总不能直接把数据贴上去吧?对此,我们引入了并兼容
这个概念。
并兼容要求参与并交差的两个关系的元组必须限制为同类型,也就是相同目,对应的属性的域也需相同。
3.1.5 连接操作
说明:连接其实和笛卡尔乘积很像,连接实际上就是一个加了条件的笛卡尔乘积,他只找出那些满足条件的元组。其符号为⋈\bowtie⋈。
一般来说,我们的连接符号代表的都是自然连接
,即笛卡尔乘积加上默认条件外键相等。下面举个例子:
如果是对这两张表做连接,其结果实际上为:
Sno | Cno | Grade | Sno | Sname | Ssex |
---|---|---|---|---|---|
S01 | C01 | 92 | S01 | 王二 | 男 |
S02 | C02 | 90 | S02 | 张三 | 男 |
S02 | C03 | 82 | S02 | 张三 | 男 |
S03 | C01 | 80 | S03 | 李四 | 男 |
其默认Sno为外键,通过外键进行连接了。
3.1.6 更名操作
说明:如果你在一条关系代数表达式中引用了两张同样的表,例如学生表连接学生表,为了没有歧义,你可以使用更名
,更名用希腊字母rho(ρ\rhoρ)来表示,对于你指定的关系代数表示式E,表示式ρx(E)\rho_x(E)ρx(E)返回表示式E的结果,并把名字x赋给了它。
实际上,还可以把更名的表示式写出ρ(A1,A2...,An)(E)\rho_{(A_1,A_2...,A_n)}(E)ρ(A1,A2...,An)(E),其中AnA_nAn表示E得出来的结果对表中各属性进行重命名。
比如ρ学生表1(学生表)\rho_{学生表1}(学生表)ρ学生表1(学生表)就是一个更名。
提示:在考试中根本不需要更名操作,因为考试出的题很少出现歧义问题。
3.1.7 除操作
说明:除法操作不好用定义来解释,如图所示:在<a1,b1>里和<a2,b2>里,明显对应的R.3和R.4都包含了S表,所以{<a1,b1>,<a2,b2>}就是除法的结果。其他不含S表的<a3,b3>可以看做结果的余数。
提示:除法操作并不是基本操作,这就说明其可以由基本操作来表示。这在考试中如果故意刁难是会涉及到的。
3.1.8 外连接
引入:想要知道什么是外连接,就要知道什么是内连接。
- 内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,就是内连接,AB两张表没有主副之分,两张表是平等的。
- 外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
外连接分类:
-
左外连接(左连接):表示左边的这张表是主表。
-
右外连接(右连接):表示右边的这张表是主表。
提示:左连接有右连接的写法,右连接也会有对应的左连接的写法。为什么这么说,当你左连接想写成右连接的时候,你把表对调一下就可以了。
说明:连接的本质是加上了条件的笛卡尔积,也就是说表1和表2做连接,那么是表1的元组去匹配满足条件的表2的元组,不满足条件则不录入结果表;但是对于左外连接,表1的所有元组都会在结果表中,即使它没有匹配到符合条件的表2元组,它也会存在,且匹配不了的表2元组在结果表位置用NULL填充。
3.1.9 外并操作
说明:我们前面说过,两个表若不满足并兼容是不可以进行集合并交差操作的,但是可以进行外并操作,即强行整合两表,结果的属性是两表属性的总和,如果其他表没有另外一个表的属性,那么那一列会被填上NULL。
3.1.10 赋值操作
说明:我们如果不想写出一条关系代数表达式来表示某个结果,而想拆分成两个步骤,那么我们可以使用赋值操作,其符号为←←←。例如:
temp1 = R×S
temp2 ← σsno=S01(S)σ_{sno = S01}(S)σsno=S01(S)
result ← temp1×temp2
提示:实际上,这个更名操作在考试中根本用不到,因为你通常都是通过嵌套的方式一口气写完一整条的关系代数表达式,而不会写出来两条。
3.1.11 练习
题目描述:设有一个零件供应关系数据库,它包括S、P、J、SPJ四个关系,请按要求写出关系代数表达式。