数据库系统概论 第二章

第二章

需要的单词:
relation:关系。(个人更喜欢称之为“关系表”,以和relationship的中文区分开)
tuple:元组
attribute:属性
domain:域
atomic:原子的
schema:模式
Cartesian Product:笛卡尔积

关系型数据库的结构

  • 在逻辑层面,关系型数据库是一系列被称作“关系表”(Relations)的二维表
  • 每个表(Relation)中每一行就代表一组具体的实体或者具体的一种关系(Relationship)
  • 关系表上的每一行叫元组
  • 关系表上的每一列叫属性
  • 每一个属性的所有可能的值所组成的集合称为域
  • n元组就是一个有n个值的元组,即表(Relation)中的一行
  • 关系表 指代 表;元组 指代 行;属性 指代 列;
  • 元组在关系表中出现的顺序是无关紧要的。
  • 所有属性的值通常应该是元原子的,即不能划分;还允许可以有一个特殊的值,即空值。
  • 一个关系表中每个属性的域分别为D1、D2…Dn,则一个关系,即所有属性的域的笛卡尔积:D1×D2×D3×…×Dn的一个子集;也可以描述为,关系表是由一系列元组构成的,每个元组都有n个元素,每个元素a1 a2 a3…an都属于对应的域D1 D2 D3 D4…Dn。
  • 元组变量:用这个变量指代一个表中的某一行,可用类似Map的取值方式获取一行中对应属性的值。比如account[‘username’]获取用户名。
  • 关系模式:就是一个表中所有的属性名组成的集合。
  • R是一个关系模式,r是一个具体的关系,则r®表示在关系模式R上的一个具体的关系r。 关系r的值(也可以说r的实例)可用一个表来决定。
  • 一个关系表中,元组的顺序是无序的。
  • 一个关系型数据库包括很多的关系表(relations),数据库中的信息被拆解成了很多个部分,每个部分都存储最小块儿的信息。 这相比于所有数据存储于一个关系表中,就可以避免信息重复地存储。
    eg:银行信息可以分为三个表存放:账户信息(账户号、支行、余额)、用户信息(姓名、街道、城市)、存款人信息(姓名、账户号)。即用“存款人信息”这个表把“账户信息”和“用户信息”两个表给连起来。

关系型数据库的主码和引用约束

主码都是候选码,候选码都是超码
候选码不都是主码(人工选的某一个候选码才是主码),超码不一定是候选码(minumum)

  • 候选码(Candidate Key):所有能唯一标识数据表中一个元组的属性名
  • 主码(Primary Key):从候选码中人为地选择一个作为主码
    超码、候选码、主码都能唯一标识一个元组
  • 外码(Foreign Key):必须是在数据表A中、同时是其他某个或者某些数据表的主码。
    外码是可以作为其所在表中的候选码的
    外码的意义
    ①外码可以保证数据表的取值都是有意义的,即通过外码为外码所在的数据表限定一个取值范围,如果取值不在范围之内,则提示违法或者异常
    ②外码可以保证数据的一致性
    ③外码可以连接多个数据表
    针对①举例:学生表里只有Abc三个人,然后有个记录选课情况的表,记录了每个学生选的课程,这个表的学生姓名是参照了学生表的外码,那么你如果往选课里插入了学生d的信息,就会提示你违法,因为d不在学生表里,也就意味着学校没有d这个人
    外码的意义主要是①,其他的两个都不重要!!!!
  • 参照完整性约束:引用关系(referencing relation)中外码的所有取值组成的集合是被引用关系(referenced relation)的所有取值组成集合的子集

查询语言

  • 分类
    ①过程性语言:需要写循环需要写如何返回、获取数据表中的数据
    ②非过程性语言:不需要写循环来获取数据,只需要通过指令就可以获取数据
  • 三种“纯”语言
    ①关系代数:结果会产生一个新的关系
    ②元组关系演算
    ③域关系演算

六种关系代数详解

选择操作

表示符号:σ
下标:选择的条件,多个条件之间用符号进行连接,这些也称作“逻辑谓词”。
注:条件里面如果需要判断两个属性的值相等,不需要用双等号,直接一个等号即可
操作符:选择语句的操作符可以是可选的操作符
作用:在数据表中挑选出符合下标所规定条件或者格式的元组数据(就是选出满足条件的所有行数据)
括号内的参数:是要进行选择的数据表的名称,即数据来自哪个数据表
注:每次笛卡尔积运算的外层必嵌套一个选择语句把有效的元组信息给筛选出来。

投影操作

表示符号:Π(就是圆周率的那个符号,音同拼音pai)
下标:需要进行投影的属性名
作用:从数据表中抽取出下标所指的属性所在的列
注:会去重!即一列中如果存在内容相同的属性,如名为“国籍”的属性列有多个数据均为“中国”,则最终投影的结果只会保留一个“中国”数据,确保该列所有种类的数据均只出现一次
括号内的参数:表示要进行投影操作的属性对应列所在的数据表,即数据的来源

并运算操作

表示符号:∪
下标:无下标
作用:直接操作两个表,将两个表的所有列数据做并运算。
要求:两表中属性的个数要相同;两表依次对应的属性应可以比较(比如不能出现对应表格的数据一个为字符串一个为浮点数,否则无法进行并集操作、无法删除所有相同的元组)
举例:A表有(a-1,b-2,c-3);B表有(a-3,b-2,c-2);则A∪B=(a-1, a-3, b-2, c-2, c-3)
注:会去重!!

差运算操作

表示符号:-
下标:无下标
作用:A-B表示从A数据表中去除掉A中在B数据表中存在的元组
要求:两表中属性的个数要相同;两表依次对应的属性应可以比较(比如不能出现对应表格的数据一个为字符串一个为浮点数,否则无法进行判断相等、无法判断是否在B中存在)

笛卡儿积操作

表示符号:×
作用:两个数据表各自的元组直接拼接
2列 × 4列 = 6列
2个元组 × 4个元组 = 8个元组

注:不去重,如果存在重复的则需要额外标注属性以区别

重命名操作

表示符号:ρ
下标:表示数据表的新名字
下标的括号内的参数:可以有多个,用逗号隔开,从前往后依次表示数据表中每个属性的新名字
ρ平级的括号内的参数:表示要进行重命名的数据表,也可以是含有数据表名称的表达式
要求:与ρ平级的括号内的数据表的属性的个数与下标的括号内的新名字个数相同

小结

①所有的表达式有下标的既可以写对应属性列的列名,也可以写对应列所在的序号(从左往右数,第几列,序号就是几)。但是极不推荐写序号,因为表意不明确!
②have an account代表有账户且存款了,对应的是单词是depositor;
have a loan代表有借款了,对应的单词是borrower
③得到相同的查询结果往往有多种查询方式,这时需要查询处理器的DML编译器筛选出效率最高的一个查询计划执行。

附加的其他操作(Additional Operations)

交集操作

标志符号:∩
要求:r ∩ s中,r和s有相同的域;r和s的各个属性是可以比较的
变形:r ∩ s = r - (r - s)

自然连接操作

标志符号:自然连接的符号
步骤:r 自然连接 s,会首先把属性列名求并集,再找到两个表中存在的相同的那些属性列,比如有A1和A2两列,则在r和s表各自的所有元组中,找A1和A2两列的属性值均相同的那些元组,并把所有满足条件的元组给添加到结果关系表里。
注:会消除掉重复的属性和值,相当于 “笛卡尔乘积和选择操作” 的结合体

除法操作

标志符号:÷
步骤:r÷s
首先确定r÷s结果的属性有哪些:就是在r的属性中去掉s中的属性(假设为B、C);
然后检查r关系表中剩下的几个属性(假设剩下A1、A2、A3三个属性)组成的所有元组,把满足条件的元组添加到结果关系表里去:对于A1、A2、A3的每种不同值的搭配,检查是否包含了s关系表中B和C属性的值的所有搭配情况,如果均包含了,则满足条件;否则不满足。
举例:
除法举例
图中,s表有DE两种属性,则在r关系表中查找每种ABC三种属性的不同值搭配,可以发现只有 αaγ 和 γaγ 这两组值的搭配,他们所在的元组同时包括了s表中DE属性值的两种搭配,于是r÷s的结果数据表中就有两个元组:αaγ 和 γaγ。

赋值操作

标志符号:←
作用:将右边表达式的结果赋值到左边的变量里面,左边的变量在后续还会继续使用,就是把部分表达式赋值给一个变量,用这个变量代替整个表达式这个整体,方便阅读和写。不能增强关系代数的表达能力,但能让复杂的表达式变得简单
赋值运算和更名的区别
——更名的生存周期是在整行的表达式、只在这个语句可用,不会在数据库中生成新的关系;
——赋值运算新产生的变量会在一系列操作的过程中都可以使用,会在数据库中生成新的关系、改变数据库模式。

数据库查询部分例题

例题数据表结构
交集运算操作例题
上面这式子也可以将两个条件用^连接放在外面,外面用选择语句,括号内用borrower和depositor的笛卡尔乘积。
自然连接和除法操作例题
在depositor和account连接后的表中,找到其所包含的“支行名字”属性的值,包括了“Brooklyn”值的所有元组,再把这些元组中的“customer_name”和”branch_name”两个属性列提取出来。
自然连接、除法、自定义匿名关系表例题
大括号是为了生成一个新的关系表,大括号内的每个小括号都是一个元组,小括号内的由逗号隔开的各个值为这个小括号这个元组的各个属性的值。这两个元组在同一列,然后外层的更名操作为这两个字符串常量值所在的列命名为branck_name。

延伸出来的操作(Extended Operations)

广义投影(Genearlized Projection)

就是在之前的投影操作的基础上,可以在原来的写“属性名”的下标的地方,进行一些属性之间的算术运算或者直接用常量构造一个结果关系广义投影举例

聚集运算函数(Aggregate Functions)

注意所有的聚集运算的结果都没有属性名也没有表名!!!

  1. 六种常用的聚集运算:
    六种常用的聚集运算
  2. 聚集运算函数举例
    聚集运算函数举例1
    最终结果是没有sum©这个表头的
    聚集运算函数举例2
    此图的函数中,g前面的branch_name表示操作完成后的数据表的名称叫做branch_name,也表示将account数据表中的所有元组按照branch_name属性进行分组,值相同的元组为一组,一共可分成3组;
    sum(balance)表示在branch_name分组后的每一组中,将balance属性列的值求和并得到一个最终的数字结果,与branch_name形成一个新的元组。(注意,此时求和得到的最终的数字结果仍然是没有属性名没有表头的!
    如果想添加sum列的属性头,可以在语句内增加一个关键字给结果列一个确切的名字,如:
    聚集运算增加关键字以添加结果的属性名
    此时,最终sum的结果列就有具体的名字:sum_balance

外连接(Outer Join)

  1. 优势
    相比于传统连接,可以避免信息丢失。
  2. 分类
    ①左外连接:左外连接将保留左侧的关系表中的所有数据,而对于左侧关系表中在右侧关系表内没有匹配到的部分属性,就置为null值
    ②右外连接:右外连接与左外连接类似
    ③全外连接:全外连接就是左、右外连接的结果求并集
  3. 不同的外连接方式的符号
    自然连接和左外连接的符号
    右外连接和全外连接的符号
  4. 与null值相关的特殊点
  • null值的含义是:表示值未知或者值不存在
  • 求最大值最小值的时候,不考虑null值,只考虑有值的数据
  • 任何包含null的算术表达式的结果都是null(还有点疑惑)
  • 两个null会被当作相同。
  • Slq中的聚集函数会忽略null值。
  • 用count函数计数的时候,需要考虑null值,
  • 比较的时候,如果涉及到了null值,则返回固定的结果unknown
  • 三值逻辑中,除了结果明确知道为true或者false的,其他的都为unknown
  • 谓词运算:xxx is unknown 如果xxx是未知的,则命题是真;而xxx = unknown,如果xxx是未知的,则命题为unknown。
  • 在重复消除和分组的时候,多个null值都会被认为是相同的。比如在xxxxxx
  • 如果谓词选择的结果为未知,则结果当作false == 还有疑惑!==

数据库的修改

概述

删除、插入、更新,都是用赋值符号来实现的,而且修改数据(包括删除、插入)只能以一个个元组为单位,不能修改单个属性的值。

删除

对数据库的删除操作
E为“找出所有要删除的元组”的表达式。
总结而言就是,先找出所有要删除的数据,然后用差运算删除掉这些数据,再把集合差运算结果赋值给要删除的表。

插入

对数据库的插入操作
要求新插入的属性和已有关系的属性的域和属性的个数相同。可以先用单个的元组或者一个关系代数表达式来连接多个元组,把单个元组或者整个表达式与已有的关系表进行并集运算,再将并集运的结果赋值给已有的关系表的变量。
举例:
数据库插入操作举例1
数据库插入操作举例2

更新

对数据库的更新操作
通过广义投影实现,可以修改某列的所有元组的某个某些属性。
整列数据更新
对整列数据更新的例子
在将所有属性投影出来时,在目标列的属性处增加表达式,来对该列进行处理
对整列数据不同数据采取不同更新
对一列的不同数据采取不同的操作的例子
通过选择语句将部分数据筛选出来再重新投影一次,在投影的时候对这部分数据进行相应的操作;同时通过选择语句将另一部分数据筛选出来,再在投影的时候进行不同的操作。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值