2.1 关系模型的基本概念
2.1.1 关系模型
什么是关系模型:
- 是一种关系数据库基于的模型,由一个或多个关系组成的集合。
- 是由行和列构成的表。
- 优点是其简单的数据表示,也易于表示复杂的查询。
- 是SQL语言的基础。
关系示例:
如图:
- 联系:指一些实体之间的关联(ID - name - dept_name - salary)。
- 关系:一种数学概念(即“表”)。
- 实体-联系(E-R):指真实世界中的逻辑。
- 关系(表)、元组(行):指机器世界中的逻辑。
关系的基本结构:
① 一般的,给出Di (i=1,2,3…k)表示表中每一列的元素集合,如:
D1 = 导师集合 = { 张清枚,刘逸 }
D2 = 专业集合 = { 计算机,信息 }
D3 = 研究生集合 = { 李勇,刘晨,王名 }
② 计算 D1 × D2 × D3 得到下表:
- 共12个元组(12行)。
- 关系:导师-专业-学生
关系的属性类型及特点:
- 关系的每个属性都有一个名称(即表中每一列的属性名称,如“导师”、“专业”、“学生”)。
- 域:每个属性的取值集合称为属性的域。
- 属性值必须为原子的,不可分割,多值属性值不是原子的(如某人有多个电话号码),复合属性值不是原子的(如名字由姓、名两个复合属性组成)。
- 特殊值NULL:是每一个域的成员,会给数据库访问和更新带来很多困难。
2.1.2 关系模式和关系实例
关系涉及的两个概念:
- 关系模式:用于描述关系的结构(即表的“表头”)
如Instructor-schema = ( ID: string, name: string, dept_name: string, salary: int )
或Instrutor-schema = (ID, name, dept_name, salary )
- 关系实例:表示一个关系的特定实例,也就是所包含的一组特定的行。
关系、关系模式、关系实例之间的区别:
- 关系:等价于变量。
- 关系模式:等价于变量类型。
- 关系实例:等价于变量值。
关系模式的表示:
- 设A1,A2,…,An是属性,一般的,用
R=(A1,A2,...,An)
表示关系模式。
如Instructor-schema = (ID,name,dept_name,salary)
- 用r®表示在关系模式R上的关系:
如:instructor(Instructor-schema) = instructor(ID,name,dept_name,salary)
关系实例的表示:
- 关系实例由表指定。
- 一个元素t代表表中的一行。
- 如果元组变量t代表一个元祖,那么t[name]表示属性name的t的值。
- 元组的顺序性是无关紧要的(元组能够以任意顺序存储),但一个关系中不能有重复的元组。
码、键;
- 超码:假设对于关系模式R,有属性K含于R,且K能够唯一标识一个元组,则称K是R的超码。
如:有关系R = (A1,A2,A3,A4),则K1 = { A1 }或K2 = { A1,A2 } 都是R的超键。- 候选码:最小的超码称为候选码。
如:K1即为R的候选码,而K2是R的超码但不是R的候选码。- 主键:如果K是一个候选码,并由用户明确定义,则称K为主键,用下划线标记。
- 外键:如果存在两个关系R和S,R=( A,B,C),S=(B,D),则在关系R上的属性B称为参照S的外码,R称为外码依赖的参照关系,S叫做外码被参照关系。如:
学生 = (学号,姓名,性别,专业号,年龄)
专业 = (专业号,专业名称)
则“学生”称为参照关系,“专业”称为被参照关系,“专业号”称为关系“学生”的外码。- 参照关系中外码的值必须在被参照关系中实际存在或为NULL。
用图表示关系:
例:某大学数据库模式图:
2.2 关系代数和关系运算
关系代数的运算概览:
2.2.1 基本运算
- 选择运算:σ(r) = { t | t∈r and p(t)}
例:有关系r,
则满足条件A=B且D>5的关系σA=B and D>5(r)为,
- 投影运算:ΠA1,A2,…,Ak(r)= 保留此k列的值,删除重复的行
例:有关系r,
则满足条件ΠA、C(r)为,
- 并运算:r∪s={ t | t∈r or t∈s }
例:有关系 r 和关系 s,
则r∪s为,
- 差运算:r - s = { t | t∈r and t∉s }
例:有关系 r 和 s,
则 r - s 为,
- 广义笛卡尔积:r × s = { { t q } | t∈r and q∈s }
例1:有关系 r 和 s,
则 r × s 为
例2:有关系 r 和 s,则 r × s 为,
- 更名运算:ρx(E)
例:ρx(A1,A2,…,An)(E)表示将关系E重命名为X,并将关系E的元素重命名为A1,A2,…,An 。
2.2.2 基本运算示例
银行示例:
例1:找出贷款额大于$1200的元组
σ额度>1200(贷款)
例2:找出贷款大于$1200的贷款号
Π贷款号(σ额度>1200(贷款))
例3:找出有贷款或有账户或两者兼有的所有客户姓名
Π客户名(借款人)∪ Π客户名(存款人)
例4:找出至少有一个贷款及一个账户的客户姓名
Π客户名(借款人)∩ Π客户名(存款人)
例5:找出在名为“鼓楼分行”的分支机构有贷款的顾客姓名
- Π客户名(σ支行名=“鼓楼分行”(σ借款人.贷款号=贷款.贷款号(贷款×借款人)))
- Π客户名(σ借款人.贷款号=贷款.贷款号(借款人×(σ支行名=“鼓楼分行”(贷款))))
注:显然后者的查询方式生成的中间量少,查询效率更高。
例6:找出在名为“鼓楼分行”的分支结构只有贷款,且在其他分支机构没有存款的顾客姓名
- Π客户名(σ支行名=“鼓楼分行”(σ借款人.贷款号=贷款.贷款号(贷款×借款人)))- Π客户名(存款人)
- Π客户名(σ借款人.贷款号=贷款.贷款号(借款人×(σ支行名=“鼓楼分行”(贷款))))- Π客户名(存款人)
注:后者查询方式更高效,理由同上。
例7:找出银行中最大的账户余额
- Π余额(账户)- Π余额(σ账户.余额<d.余额(账户×ρd(账户)))
2.2.3 附加运算
定义附加运算的目的:用以简化一些常用查询。
- 交运算:r ∩ s = { t | t∈r and t∈s } = r ∩ s = r - ( r - s )
例:有关系 r 和 s,
则 r ∩ s为,
- 自然连接:假设有关系R=(A,B,C,D),S=(E,B,D),则 r ∞ s =Πr.A,r.B,r.C,r.D,s.E(σr.B=s.B ^ r.D=s.D(r×s))
例:有关系 r 和 s,则 r∞s 为,
- 除运算:假设有关系R=(A1,…,Am,B1,…,Bn),S=(B1,…,Bn),则关系R - S = (A1,…,Am),r ÷ s={ t | t∈ΠR-S(r)∧ ∀ u∈r,tu∈r }
例:有关系 r 和 s,
则 r ÷ s 为,
- 赋值运算:“←”可以使复杂的查询表达变的简单
例:有表达式,
可表示为,
2.2.4 附加运算示例
银行示例:
例1:找出至少拥有一个“鼓楼分行”和“金明分行”分支机构的账户的用户姓名
- Π客户名(σ支行名=“鼓楼分行”(存款人∞账户))∩ Π客户名(σ支行名=“金明分行”(存款人∞账户))
- Π客户名,支行名(存款人∞账户)÷ρtemp(支行名)({(“鼓楼分行”),(“金明分行”)})
例2:找出拥有开封市所有分支机构的账户的客户姓名
- Π客户名,支行名(存款人∞账户)÷ Π支行名(σ支行城市=“开封市”(支行))
2.3 扩展运算及空值
2.3.1 扩展运算
- 广义投影:ΠF1,F2,…,Fn(E),其中F1,F2,…,Fn是涉及E模式中常量和属性的算数表达式
例:给出关系
信用卡信息=(客户名,透支上限,已透支额度)
则找出每个客户还能花费多少,可表述为
Π客户名,透支上限-已透支额度(信用卡信息)
- 聚集函数:
avg:平均值
min:最小值
max:最大值
sum:值的总和
count:值的数量
聚集函数的关系代数表达式:
G1,G2,…,Gn g F1(A1),F2(A2),…,Fn(An)(E)
- G1,G2,…,Gn是用于分组的一系列属性。
- Fi是聚集函数
- Ai是属性名
例:有关系 r,
则,求C列的平均值可表示为
按A分组求C列的和可表示为
按B分组求C列的平均值可表示为
- 注意:聚集运算的结果是没有名称的,可以使用更名运算为其命名或把重命名作为聚集运算的一部分。
- 如:支行名 g sum(余额)as “总余额”(账户),指将运算后的余额之和所在列重命名为“总余额”。
- 外连接:
例:有关系loan和关系borrower
则内连接为,
左外连接为,
右外连接为,
全外连接为,
注:对于无法确定的信息用null表示。
2.3.2 空值及数据库修改
空值的性质:
- 元组的某些属性值是可以为空的。
- null表示未知值或值不存在。
- 涉及空的任何算术表达式的结果为空。
- 在SQL对空值的处理语义中,聚集函数会忽略空值。
- 在SQL对空值的处理语义中,为了消除重复和分组,空值和其他值同等对待。
- 与空值的比较将返回一个特殊值:unknown。
- 使用特殊值unknown的三值逻辑:
- OR:
(unknown or true)= true
(unknow or false)= unknown
(unknown or unknown)= unknown- AND:
(true and unknown)= unknown
(false and unknown)= false
(unknown and unknown)= unknown- NOT:
(not unknown)= unknown
- 在SQL中,如果谓词P的值为unknown,那么“P is unknown”的值为真。
- 如果选择谓词的值为unknown,那么选择谓词的结果被认为false。
数据库的修改:
- 删除
- 插入
- 更新
注:所有这些操作都使用赋值操作表示
银行示例:
- 删除:r ← r - E (其中r是关系,E是关系代数表达式)
例1:删除“鼓楼分行”分支结构的所有账户
可表示为:账户 ← 账户 - σ支行名=“鼓楼分行”(账户)
例2:删除贷款额在0到50之间的所有贷款
可表示为:贷款 ← 贷款 - σ额度>=0 and 额度<=50(贷款)
例3:删除位于开封市的分支机构的所有账户
可表示为:
r1 ← σ支行城市=“开封市”(账户∞支行)
r2 ← Π账户号,支行名,余额(r1)
r3 ← Π客户名,账户名(存款人∞r2)
账户 ← 账户 - r2
存款人 ← 存款人 - r3
- 插入:r ← r ∪ E(其中r是关系,E是关系代数表达式)
例1:向数据库中插入信息:张三在“鼓楼分行”分支机构的账户A-973上有1200RMB
可表示为:
账户 ← 账户 ∪ {(A-973,“鼓楼分行”,1200)}
存款人 ← 存款人∪ {(“张三”,A-973)}
例2:对“鼓楼区支行”分支机构的每一个贷款客户赠送一个新的200RMB的存款账户,并将其贷款号码作为此账户的号码
可表示为:
r1 ← σ支行名=“鼓楼分行”(借款人∞贷款)
账户 ← 账户∪ Π贷款号,支行名,200(r1)
存款人 ← 存款人 ∪ Π客户名,贷款号(r1)
- 更新:r ← ΠF1,F2,…,Fi(r)(其中,当第i个属性不被修改时,Fi表示的是r的第i个属性,当被修改时,Fi表示的是一个只涉及常量和r属性的表达式,表达式给出了此属性的新值)
例1:要付给所有账户5%的利息
可表示为:账户 ← Π账户号,支行名,余额*1.05(账户)
例2:给余额超过10 000以上的账户付6%的利息,而其他账户得到5%的利息
可表示为:
账户 ← Π账户号,支行名,余额*1.06(σ余额>10 000(账户))∪ Π账户号,支行名,余额*1.05(σ余额<=10000(账户))
(完)