+ [4 模式图](#4__46)
+ [5 关系查询语言](#5__52)
+ [6 关系代数](#6__62)
+ - [6.1 选择运算](#61__69)
- [6.2 投影运算](#62__78)
- [6.3 笛卡尔积运算](#63__86)
- [6.4 连接运算](#64__97)
- [6.5 集合运算](#65__107)
- [6.6 赋值运算](#66__119)
- [6.7 更名运算](#67__124)
- [6.8 等价查询](#68__129)
- [6.9 其他关系运算](#69__134)
1关系数据库的结构
关系数据库由表的集合构成。
表中的一行数据就代表了一组值之间存在某种联系,这和数学上关系概念有着密切的联系,这也正是关系数据模型名称的由来。在数学中,一组值被看做一个元组。n个值之间的一种联系在数学上用这些值得一个n元组表示。在数据库中元组被用来代指行,属性则被用来代指列。用关系实例这个术语来指代一个关系的特定实例。也就是说,关系实例包含一组特定的行。关系的每个属性都存在一个允许取值的集合,称为该属性的域。
空值是一个特殊的值,它表示值未知或者并不存在。以后我们将看到,空值会在我们访问和更新数据库时带来许多困难,因此尽量避免使用空值。
我们可以看到,关系型数据结构在存储和处理时固定了数据的格式,这种严格的结构适用于定义明确并且相对静态的应用,但是不太适用于数据本身甚至数据类型这些结构都随着时间而变化的应用,现代企业要平衡好二者。
2 数据库模式
数据库模式是数据库的逻辑设计,而数据库实例是给定时刻数据库中数据的一个快照。比如下面就是一个关系模式:
department(dept_Id,dept_name, building, budget)
3 码
我们必须要能够区分不同元组。超码可以允许我们在一个关系中唯一的标识一个元组。比如上面dept_Id
就是一个超码。
能够唯一确定元组且其任何真子集都不是超码的超码称为候选码,比如dept_Id和dept_name的组合是一个超码,但是dept_name是无关紧要的,不是候选码。只要能够唯一确定元组且其任何真子集都不是超码,它就可以被称之为候选码。比如如果dept_name
和building
组成的元组可满足上列条件,他也是候选码。
我们用主码(primary key)来表示数据库设计者中选择作为一个关系中区分不同元组的主要方式的候选码。主码也被称作主码约束。习惯将主码列于其他属性之前,并加下划线。
department(dept_Id,dept_name, building, budget)
外码约束(foreign-key constarint)表示,在任何数据库实例中,r1的每个元组对A的取值必须也是r2中某个元组对B的取值。也就是表A中的该属性的值一定可以在表B中找到。r1关系在这里称为引用关系,r2关系在这里被称为被引用关系。
注意在外码约束中,被引用属性必须书被引用关系的主码。
更广泛的约束被称为引用完整性约束(referential integrity constraint),它放宽了被引用属性构成被引用关系主码的要求。
4 模式图
一个带有主码和外码的数据库模式可以用模式图来表示。
主码用下划线表示,外码约束从引用关系指向被引用关系。双头箭头表示引用完整性约束。注意实体-联系(E-R)图与模式图不是同一个东西,不要混淆。
5 关系查询语言
查询语言是用户从数据库中请求获取信息的语言。分为三种。
- 命令式查询语言。用户指导系统在数据库上执行特定的运算序列以计算得出结果,这类语言通常有一个状态变量的概念,状态变量会在计算过程中被更新。
- 函数式查询语言。计算被表示为对函数的求职,函数将在数据库数据或者其它函数给出的结果上运行,但是没有附带作用,不会更新程序的状态。
- 声明式查询语言。用户只需要描述所需信息,并不需要给出获取该信息的具体步骤序列或者函数调用。获取信息的方式是数据库系统的工作。
关系代数式函数式查询语言,它构成了SQL查询语言的基础。元组关系演算和域关系演算是声明式的,后面文章我们将进一步介绍。
常用的查询语言比如SQL同时包含命令式、函数式和声明式的方法元素。
6 关系代数
关系代数由一组运算组成,这组运算接受一个或者两个关系作为输出,并且输出一个新的关系作为他们的结果。
其中一些运算只在一个关系上进行,比如选择、投影、改名,这被称为一元运算。
同理,并,笛卡尔积和集差等被称为二元运算。
6.1 选择运算
我们用sigma(σ)来代表选择。比如选择物理系老师,可以表示为:
还可以有=,≠,<,≤,>,≥等用于比较,使用and(∧),or(∨)和not(¬)。
选择谓词可以包含两个属性之间的比较,比如系名与其所在教学楼名字相同的所有系。
6.2 投影运算
如果我们希望列出所有教师的ID,name和salary,就可以使用投影运算。由于关系是一个集合,任何重复的行都会被删除。使用大写的pi(π)表示。
投影运算的基础版本在列表中只许出现属性,在其泛化版本中则允许出现属性的表达式。
另外,关系运算可以复合使用。
6.3 笛卡尔积运算
笛卡尔积运算使用叉号(×)表示,它允许我们结合来自任意两个关系的信息。比如r1×r2。数据库的笛卡尔积与集合中的笛卡尔积略有不同,它不是表示由r1和r2生成的元组对(t1,t2),而是将其拼接为单个元组。假设r1有n1个元组,r2有n2个元组,r中就有n1 x n2个元组。
由于同一个属性名可能出现在多个不同的关系中,我们需要加以区分,比如teacher.ID
。考虑一个问题,一个关系与自己做笛卡尔积,要如何处理?
答案是对关系更名运算来避免。
6.4 连接运算
查询所有教师及他们所教授的课,可以进行如下运算。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!