数据库第二章(关系模型)
目录
1、关系数据库的结构:
定义:在逻辑层次上,关系数据库是一个称为关系的二维表的集合。关系表示实体集或关系集。关系的行表示实体或关系
关系数据库基本结构:(1)关系的每一行都可以称为元组(tuple)
(2)关系的每一列都有一个名称(关系的命名列称为属性(attributes))
(3)每个属性允许的值集称为属性的域(domain)
属性值(通常)必须是原子的;也就是说,不可分割的。一个元组在属性上的值可以是
一个帐号,但不能是一组帐号。特殊值null是每个域的成员。
关系(relation)的定义:形式上,给定集合D1,D2…,Dn;关系r是 D1 x D2 x…x Dn 的子集,因此,关系是一组n元组(a1,a2,…,an),其中每个ai属于Di
关系模式(relation schema),A1,A2,…An 是属性名字,R = (A1, A2, …, An )是关系模式。
customer_schema = (customer_name, customer_street, customer_city)
r(R)表示关系模式R上的关系r ,
customer (customer_schema)
关系的当前值(关系实例)由表指定。关系是无序的。
关系数据库(relational database):数据库由多个关系组成,有关企业的信息被分解为多个部分,每个关系存储一部分信息
码(key)定义:K是属性的集合,K是R的子集。
超码(super key):如果K的值足以识别每个可能关系R(R)的唯一元组,则K是R的超码。
候选码(candidate key):如果K是最小的超码,则K是候选码
主码(primary key):一种候选码,被选为关系中识别元组的主要方法,应选值从不或者很少改变的属性。例如:邮政地址是唯一的,但可能会改变,所以不适合作为主码。
外码(Foreign Key):关系r1可以具有与另一个关系r2的主码相对应的属性。该属性称为外码。r1是引用关系,r2是被引用关系,外码是相对关系r1来定义的。例如:存款的customer_name和account_number属性分别是customer和account的对应外键,存款是引用关系,customer和account是被引用关系。
引用约束(Referencing Constraint):只有被引用关系的主码属性中出现的值才能出现在引用关系的外码属性中
模式图:
查询语言(query languages):用户从数据库请求信息的语言。语言分为过程性(Procedural)的和非过程性的(Non-procedural(或声明性的(declarative)))。
“纯”语言(pure languages):关系代数(过程性的),元组关系演算(calculus,非过程性的),域关系演算(domain relational calculus,非过程性的)
2、基本关系代数运算
关系代数(relational algebra): 由一组运算符组成,以一个或两个关系作为输入,并产生一个新的关系作为结果。
6种基本的运算符:
选择(select):s
投影(project):Õ
并(union):È
做差(set difference):–
笛卡尔积(cartesian product):X
重命名(rename):r
选择运算的符号:s p(r),p为选择谓语,定义为:sp(r) = {t | t Î r and p(t)}如下例子:
投影运算(project operation):Õ,一元运算,选取某些列,A,C为属性的名字。结果定义为通过删除未列出的列而获得的k列之间的关系(下图为删掉B列)。从结果中删除重复行,因为关系是集合。
并运算(union operation):类似于集合的并运算。合并两个关系,并删掉重复行,因为关系是集合。符号是r È s。定义为:r È s = {t | t Î r or t Î s}。r与s必须有相同的参数(相同数量的属性);属性域必须是兼容的。r的第二列与s的第二列处理相同类型的值。
差运算(set difference operation):类似于集合的差运算。符号:r – s,定义为:
r – s = {t | t Î r and tÏs }。必须在兼容关系之间取集合差,r和s必须有相同的参数。R与s的属性域必须是可兼容的。
笛卡尔积运算(Cartesian-Product Operation): 将一个关系的每个元组与另一个关系的每个元组配对。符号:rXs,定义为r x s = {t q | t Î r and q Î s},假设r和s的属性是不相交的,就是R Ç S = Æ,如果r和s的属性不是不相交的,那么必须使用重命名(rename)
重命名运算(Rename Operation):允许我们命名并引用关系代数表达式的结果,允许我们使用多个名称引用关系,r x (E):返回名为X的表达式E。:返回名为X的表达式E的结果,并将属性重命名为A1、A2、An。
找出和smith住在同一个城市的所有顾客的名字:
3、其他关系代数运算
附加运算(Additional Operations):我们定义了附加的运算,这些运算不会给关系代数增加任何功能,但是可以简化常见的查询。
交运算(Set-Intersection Operation):符号:r Ç s,定义为:r Ç s = { t | t Î r and t Î s },假设r,s具有相同的参数,r,s的属性是可兼容的。注意:r Ç s = r – (r – s)。
自然连接:符号:r s,让r和s分别(respectively)是模式R和S的关系。r s是在R È S上的一个关系,如下:1.考虑r中的每一对元组tr和s中的每一对元组ts,如果tr和ts在R Ç S种的每一个属性有相同的值,在结果种添加一个元组t。
自然连接通过以下方式连接两个关系:
相等于同名属性
并将每对相等属性的一个副本投影出来。
除运算(Division Operation):符号:r ¸ s 。r和s分别是R和S模式上的关系。R=(A1,…Am,B1…Bn) S=(B1…Bn)。r ¸s的结果是关系基于R–S=(A1,…,Am)。
r ¸ s = { t | t Î Õ R-S (r) Ù " u Î s ( tu Î r ) }其中tu表示元组t和u的连接,以生成单个元组。
关于基本代数运算的定义,让r(R)和s(S)是关系,然后S属于R。
r ¸ s =ÕR-S (r ) – ÕR-S ( ( ÕR-S (r ) x s ) – ÕR-S,S(r ))
赋值(assignment operation):提供了一种表示复杂查询的方便方法,将查询写为一个顺序程序,由1.一系列赋值组成2. 后跟一个表达式,其值作为查询结果显示。必须始终为临时关系变量赋值。
右边的结果分配给左边的关系变量。可以在后续表达式中使用变量。
4、扩展关系代数运算
拓展运算:广义投影(Generalized Projection),聚集函数(Aggregate Functions
),外连接(outer-join)。
广义连接:通过允许在投影列表中使用算术函数来扩展投影运算
E是任何一个关系代数表达式,F1,F2,…,Fn中的每一个都是涉及E的模式中的常量和属性的算术表达式。
聚集函数:聚集函数接受值的集合并返回单个值作为结果。
avg:平均值
min:最小值
max:最大值
sum:值的和
count:值的数量
在关系代数中的聚集运算:
聚集的结果没有一个名字,可以使用重命名运算给它一个名字。我们允许将重命名作为聚合操作的一部分。branch_name g sum(balance) (account),变成branch_name g sum(balance) as sum-balance (account)
外连接(Outer Join):联接操作的扩展,可避免信息丢失。计算联接,然后将一个关系中与另一个关系中的元组不匹配的元组添加到联接的结果中。使用空值:1、null表示值未知或不存在;2、根据定义,所有涉及null的比较(粗略地说)都是错误的。
下图为左外连接例子:
下图为右外连接例子:
下图为全外连接例子:
5、空值
空值(Null Values):元组的某些属性可能有一个null值,用null表示。null表示未知值或值不存在。任何涉及null的算术表达式的结果都是null。聚合函数只是忽略空值(如在SQL中)。对于重复消除和分组,null与任何其他值一样对待,并且假设两个null相同。与空值的比较返回特殊的真值:未知(unknown)。如果select谓词的计算结果为未知,则将其视为false。
利用真值未知的三值逻辑:
在SQL中,如果谓词P的计算结果为未知,则“P is unknown”的计算结果为true。
6、修改数据库
数据库的修改(Modification of the Database):可以使用以下操作修改数据库的内容:
- 删除(deletion)
- 插入(Insertion)
- 更新(updating)
所有这些操作都用赋值运算符表示
删除(deletion):delete请求的表达方式与查询类似,不同的是不向用户显示元组,而是从数据库中删除所选元组。只能删除整个元组;不能仅删除特定属性上的值。
删除在关系代数中表示为:
;其中r是关系,E是关系代数查询。
插入(insertion):要将数据插入到关系中,我们可以指定要插入的元组,编写一个查询,查询的结果是要插入的元组集。
在关系代数中,插入由
表示。其中r是一个关系,E是一个关系代数表达式。一个元组的插入表示为E是一个包含一个元组的常数关系。
在数据库中插入信息,说明史密斯在佩里里奇分行的账户A-973中有1200美元:
为Perryridge分行的所有贷款客户提供200美元储蓄账户作为礼品。让贷款号码作为新储蓄帐户的帐号:
更新(updating):更改元组中的值而不向元组中的所有值收费的机制,使用广义投影运算符执行此任务:
。每个Fi要么, r的第I个属性,如果第I个属性没有更新,要么,如果要更新属性,则Fi是一个表达式,只涉及常量和r的属性,从而为属性提供新值。
向所有账户支付5%的利息
支付余额超过10000美元的所有账户6%的利息,并支付所有其他5%的利息