【数据库系统原理】第二章 关系数据模型

2.1 关系模型的基本概念

2.1.1 关系模型

什么是关系模型:

  • 是一种关系数据库基于的模型,由一个或多个关系组成的集合。
  • 是由行和列构成的表。
  • 优点是其简单的数据表示,也易于表示复杂的查询。
  • 是SQL语言的基础。

关系示例:

【数据库系统原理】第二章 关系数据模型_第1张图片

如图:

  • 联系:指一些实体之间的关联(ID - name - dept_name - salary)。
  • 关系:一种数学概念(即“表”)。
  • 实体-联系(E-R):指真实世界中的逻辑。
  • 关系(表)、元组(行):指机器世界中的逻辑。

关系的基本结构:
① 一般的,给出Di (i=1,2,3…k)表示表中每一列的元素集合,如:

D1 = 导师集合 = { 张清枚,刘逸 }
D2 = 专业集合 = { 计算机,信息 }
D3 = 研究生集合 = { 李勇,刘晨,王名 }

② 计算 D1 × D2 × D3 得到下表:

【数据库系统原理】第二章 关系数据模型_第2张图片
  • 共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。

用图表示关系:
例:某大学数据库模式图:

【数据库系统原理】第二章 关系数据模型_第3张图片

2.2 关系代数和关系运算

关系代数的运算概览:

【数据库系统原理】第二章 关系数据模型_第4张图片

2.2.1 基本运算

  • 选择运算:σ(r) = { t | t∈r and p(t)}
    例:有关系r,
    【数据库系统原理】第二章 关系数据模型_第5张图片

则满足条件A=B且D>5的关系σA=B and D>5(r)为,

【数据库系统原理】第二章 关系数据模型_第6张图片
  • 投影运算:ΠA1,A2,…,Ak(r)= 保留此k列的值,删除重复的行
    例:有关系r,
    【数据库系统原理】第二章 关系数据模型_第7张图片

则满足条件ΠA、C(r)为,

【数据库系统原理】第二章 关系数据模型_第8张图片

  • 并运算:r∪s={ t | t∈r or t∈s }
    例:有关系 r 和关系 s,
    【数据库系统原理】第二章 关系数据模型_第9张图片

则r∪s为,

【数据库系统原理】第二章 关系数据模型_第10张图片
  • 差运算:r - s = { t | t∈r and t∉s }
    例:有关系 r 和 s,
    【数据库系统原理】第二章 关系数据模型_第11张图片

则 r - s 为,

【数据库系统原理】第二章 关系数据模型_第12张图片
  • 广义笛卡尔积:r × s = { { t q } | t∈r and q∈s }
    例1:有关系 r 和 s,
    【数据库系统原理】第二章 关系数据模型_第13张图片

则 r × s 为

【数据库系统原理】第二章 关系数据模型_第14张图片

例2:有关系 r 和 s,则 r × s 为,

【数据库系统原理】第二章 关系数据模型_第15张图片
  • 更名运算:ρx(E)
    例:ρx(A1,A2,…,An)(E)表示将关系E重命名为X,并将关系E的元素重命名为A1,A2,…,An

2.2.2 基本运算示例

银行示例:

【数据库系统原理】第二章 关系数据模型_第16张图片

例1:找出贷款额大于$1200的元组

σ额度>1200(贷款)

例2:找出贷款大于$1200的贷款号

Π贷款号(σ额度>1200(贷款))

例3:找出有贷款或有账户或两者兼有的所有客户姓名

Π客户名(借款人)∪ Π客户名(存款人)

例4:找出至少有一个贷款及一个账户的客户姓名

Π客户名(借款人)∩ Π客户名(存款人)

例5:找出在名为“鼓楼分行”的分支机构有贷款的顾客姓名

  • Π客户名(σ支行名=“鼓楼分行”(σ借款人.贷款号=贷款.贷款号(贷款×借款人)))
  • Π客户名(σ借款人.贷款号=贷款.贷款号(借款人×(σ支行名=“鼓楼分行”(贷款))))

注:显然后者的查询方式生成的中间量少,查询效率更高。

例6:找出在名为“鼓楼分行”的分支结构只有贷款,且在其他分支机构没有存款的顾客姓名

  • Π客户名(σ支行名=“鼓楼分行”(σ借款人.贷款号=贷款.贷款号(贷款×借款人)))- Π客户名(存款人)
  • Π客户名(σ借款人.贷款号=贷款.贷款号(借款人×(σ支行名=“鼓楼分行”(贷款))))- Π客户名(存款人)

注:后者查询方式更高效,理由同上。

例7:找出银行中最大的账户余额

  • Π余额(账户)- Π余额(σ账户.余额(账户×ρd(账户)))

2.2.3 附加运算

定义附加运算的目的:用以简化一些常用查询。

  • 交运算:r ∩ s = { t | t∈r and t∈s } = r ∩ s = r - ( r - s )
    例:有关系 r 和 s,
【数据库系统原理】第二章 关系数据模型_第17张图片

则 r ∩ s为,

【数据库系统原理】第二章 关系数据模型_第18张图片
  • 自然连接:假设有关系R=(A,B,C,D),S=(E,B,D),则 r ∞ s =Πr.A,r.B,r.C,r.D,s.Er.B=s.B ^ r.D=s.D(r×s))
    例:有关系 r 和 s,则 r∞s 为,
【数据库系统原理】第二章 关系数据模型_第19张图片
  • 除运算:假设有关系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,
【数据库系统原理】第二章 关系数据模型_第20张图片

则 r ÷ s 为,

【数据库系统原理】第二章 关系数据模型_第21张图片
  • 赋值运算:“←”可以使复杂的查询表达变的简单
    例:有表达式,

可表示为,

【数据库系统原理】第二章 关系数据模型_第22张图片

2.2.4 附加运算示例

银行示例:

【数据库系统原理】第二章 关系数据模型_第23张图片

例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)

  1. G1,G2,…,Gn是用于分组的一系列属性。
  2. Fi是聚集函数
  3. Ai是属性名

例:有关系 r,

【数据库系统原理】第二章 关系数据模型_第24张图片

则,求C列的平均值可表示为

【数据库系统原理】第二章 关系数据模型_第25张图片

按A分组求C列的和可表示为

【数据库系统原理】第二章 关系数据模型_第26张图片

按B分组求C列的平均值可表示为

【数据库系统原理】第二章 关系数据模型_第27张图片
  • 注意:聚集运算的结果是没有名称的,可以使用更名运算为其命名或把重命名作为聚集运算的一部分。
  • 如:支行名 g sum(余额)as “总余额”(账户),指将运算后的余额之和所在列重命名为“总余额”。
  • 外连接:
    例:有关系loan和关系borrower
【数据库系统原理】第二章 关系数据模型_第28张图片

则内连接为,

【数据库系统原理】第二章 关系数据模型_第29张图片

左外连接为,

【数据库系统原理】第二章 关系数据模型_第30张图片

右外连接为,

【数据库系统原理】第二章 关系数据模型_第31张图片

全外连接为,

【数据库系统原理】第二章 关系数据模型_第32张图片

注:对于无法确定的信息用null表示。

2.3.2 空值及数据库修改

空值的性质:

  1. 元组的某些属性值是可以为空的。
  2. null表示未知值或值不存在。
  3. 涉及空的任何算术表达式的结果为空。
  4. 在SQL对空值的处理语义中,聚集函数会忽略空值。
  5. 在SQL对空值的处理语义中,为了消除重复和分组,空值和其他值同等对待。
  6. 与空值的比较将返回一个特殊值:unknown。
  7. 使用特殊值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
  1. 在SQL中,如果谓词P的值为unknown,那么“P is unknown”的值为真。
  2. 如果选择谓词的值为unknown,那么选择谓词的结果被认为false。

数据库的修改:

  1. 删除
  2. 插入
  3. 更新

注:所有这些操作都使用赋值操作表示

银行示例:

【数据库系统原理】第二章 关系数据模型_第33张图片
  • 删除: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(账户))

(完)

你可能感兴趣的:(《数据库原理》学习笔记)