关系数据库与关系代数,这部分知识最常见的考点有两个,一个是关系代数写查询语句,另一个是三种完整性约束。这里试图用最通俗的语言做知识整理,只要耐心看一遍肯定能看明白。具体的习题肯定要比这复杂会进一步总结好用的套路。
期待您的关注!
笛卡尔积D1XD2X…Dn的子集叫做在域D1, D2, …, Dn(这里的Di看成不同的属性就行)上的关系,关系在用户的眼中关系是一张扁平的二维表(不含重复信息行)。
关系模式是对关系的描述,形式化表示为R(U,D,dom,F),其中U是属性的集合,D表示属性都来自哪些域,dom指属性到域的映射关系,F表示存在的一些函数依赖。括号里可以只写D,即可表示为R(D1,D2,D3···)。
关系模式是型,是静态稳定的。关系是值,是动态不断变化的。关系就是关系模式在某一时刻的状态和内容。更通俗一点来说,关系模式是表头比如Student(sno,sname,sage),而关系就是下面的表。
关系模型是若干关系模式组成的集合。我们之前学过数据模型的三要素,具体到关系模型的三要素就是关系数据结构、关系操作集合和关系完整性约束。
关系数据库的型(称为关系数据库模式)是若干域的定义以及这些域上定义的若干关系模式。关系数据库的值(就是狭义的关系数据库)是这些关系模式在某一时刻对应的关系的集合。
关系操作包括查询(query)、插入(insert)、删除(delete)、修改(update)四种,一般将查询视作独立的一部分,其他三种视为另一部分。
查询操作表达能力很强,是关系操作中最主要的部分。
查询操作又可分为选择(select)、投影(project)、连接(join)、除(divide)、并(union)、差(except)、交(intersection)、笛卡尔积8种操作,其中选择、投影、并、差、笛卡尔积是5种基本操作。
具体的实现在下面的关系代数中会详细讲到。
关系代数运算分为传统的集合运算和专门的关系运算,值得注意的是关系运算的结果仍然是关系,可以参与下一步的关系运算。
并、差、交三种集合运算的前提是关系R和S具有相同的目(列数),相对应的列属性具有相同的域(范围)。
并(R ∪ \cup ∪S):关系R和关系S合并成一个表,重复的行(元组)仅保留一个。
差(R-S):从关系R中剔除在关系S中出现的行。
交(R ∩ \cap ∩S):仅保留关系R和S共有的行。
首先回顾——狭义的笛卡尔积是由若干属性列(如D1、D2、D3)分别任取值组合的所有情况的集合,记作D1XD2XD3。
那么广义的笛卡尔积就是由若干关系(比如关系R和关系S)分别任取元组(行)组合的所有情况的集合,记作RXS。
形象来说就是把参与广义笛卡尔积的关系R和S都看做只有一个大属性列,他们的每一个元组(行)是自己这个大属性列的某一取值,对这两个大属性列进行笛卡尔积的操作过程是非常容易理解的。具体操作如下图。
选择( σ \sigma σ操作):在关系R中选择满足给定条件的元组(行),应用最为广泛,常常是选择的结果往往作为一个中间结果供下一步投影等操作使用。
投影( π \pi π操作):从关系R中选出若干属性列组成新的关系。投影常用于仅要求获取某些属性列的信息。
投影运算可能缩减元组的个数,这个很容易理解,因为投影运算的结果也是一个关系,这个结果关系需要缩减可能出现的重复行。
连接( θ \theta θ操作):从两个关系的广义笛卡尔积中选择属性间满足一定条件的元组,也叫 θ \theta θ连接。连接常用于通过A表获取与其有公共属性列的B表中的非公共属性信息。
θ \theta θ连接特殊到 θ \theta θ为"="时,该连接称之为等值连接,示例如下—
等值连接进一步特殊,即等值连接中两相等的属性组相同时,称为自然连接,示例如下—
除( ÷ \div ÷):课本上的定义非常拗口,其实实际操作很简单可以长话短说。但还是想让大家尽量先理解原理,写得多一点。除操作常用于查询“至少”、“全部”地满足某一条件的实体。
除操作要用到一个叫象集的概念。假设有一关系其属性列被分为两个属性组X和Y(注意X和Y可能都好几个属性),记为R(X,Y)。给定一个存在的X的值比如小x,然后我们从R中筛选出所有X=小x的元组(选择),再看看这些元组一共包含多少个不同的Y值把这些Y值组成一个集合(投影),这个Y集合就叫做小x的象集。
我们知道了,象集形象一些来说就是:有个关系R(X,Y),给定一个X的值小x,看看这个小x值有多厉害,即它在的元组能囊括多少个不同的Y值。
下面除操作就好说了,首先明确只有含有公共属性组的关系R和S才能够相除,即R(X,Y)和S(Y,Z)可以相除。这个除操作就是对于R中的每个不同的X值都求一下象集(Y值的集合),一旦一个X值的象集包含S中所有的Y值,那么我们就把这个X值保留下来,最终保留下来的X值的集合就是R ÷ \div ÷S的结果。
忽略象集这个概念我们得到了R(X,Y) ÷ \div ÷S(Y,Z)最形象的说法,即先明确被除数和除数的公共部分Y,然后直接从被除数R中找非公共部分X,看哪个X值厉害到“该X值元组的Y值多到能囊括S中所有的Y值”,足够厉害的X值才能保留下来当结果。示例如下:
上面我们一共学习了8种关系代数运算:
R ∪ \cup ∪S、R ∩ \cap ∩S、R–S、R×S、 σ \sigma σ、 π \pi π、R ⋈ \Join ⋈ S、R ÷ \div ÷ S
其中R ∪ \cup ∪S、R–S、R×S、 σ \sigma σ、 π \pi π称为5种基本关系代数,因为其他三种可用这五种基本运算表示,具体如下。
三种完整性约束都可使用SQL语句设置,之后章节总结会说到,这里只简单介绍一下概念。
主码:一个关系表中唯一标识元组的属性,也就是说每个元组的主码属性都各不相同。比如学生表的学号就是主码,主码具有唯一性。
实体完整性就是指一个表中主码的属性不可取空。这个很容易理解,唯一区别你和其他学生的学号信息一旦取空还怎么确认这个人是你呢。
如果一个关系R有一属性F是另一个关系S的主码,那么我们称F是关系R的外码,称R是参照关系,S是被参照关系。
参照完整性即是说,R中的F既然是参照S的主码来的,那么这个F取值要么就是S的中存在的一个主码值,要么就取空,反正不能无中生有放上一个S主码中不存在的值,否则就不是参照来的了。
这个也很容易理解,比如用户规定这个关系表中年龄这一属性不能超过24岁否则无法输入等自定义的要求。
不做要求,历年真题中从未考察该块知识。