引言
DBMS是由相互关联的数据集合以及一组用于访问这些数据集合的程序组成。数据描述特定的企业。
数据库系统设计用来存储大量的信息,所以不仅要考虑数据的存储结构还要考虑如何管理这些数据结构以及如何查询,同时还要保证数据存储的安全性和稳定性。
数据模型(Data model)一个用于描述数据、数据之间联系、数据语义和数据约束的概念工具的集合。
关系数据模型是最广泛使用的讲述君存储到数据库中的模型,其他数据模型有面向对象模型,对象-关系模型和半结构化的数据模型
数据操纵语言(DML):非过程化语言,只关注获得用户需要的数据,而不关注如何获得这些数据。
数据定义语言(DDL):说明数据模式和数据的其他属性定义的语言
数据库设计主要包括数据库模式的设计:实体-联系模型(E-R模型)是广泛用于数据库模式设计的数据模型,设计了一种方便图形化的方法来观察数据、联系和约束
数据库由几个子系统组成:
a/存储管理器子系统——在数据库中存储的低层数据与应用程序向系统提交的查询之间的接口。
b/查询处理器子系统——负责编译和执行DDL和DML语句事务管理——负责保证不管是否有故障发生,数据库都要处于一致的state(正确的state),还要保证发生的事务执行不冲突
数据库系统结构大概包括两种——两层/三层
a/两层体系结构之间前端和后端的数据库直接通信
b/三层体系结构含有中间件,后端被分为应用服务器和数据库服务器
目录
一、关系数据库的结构
1. 关系数据库简介
- 关系数据库基于关系模型,是由一个或多个关系组成的集合
- 通俗来说是由表(行和列)组成的数据集合
- 简洁、优雅,便于复杂数据结构查询
- SQL最广泛的查询语言用于创建、查询和操纵数据库
2. 关系数据库的结构
2.1 关系基本结构
关系数据库由表的集合构成(类似于多个excel表格组成的一个集合)。如下图所示,即为一个名为Instructor
的一个table:
一般来说,table中的一行数据代表了一组值之间的一种联系。一个table就是这种联系的集合。
- 关系:一般地,给出集合D1,D2,…,Dn,关系r 是D1XD2X…XDn的子集,即一系列Di的笛卡尔积的子集。
2.2 属性类型
- 可以使用数学上的关系的概念与table 的概念联系起来,在关系模型的术语中,关系用来指代table,元组(tuple)用来指代行。属性指的是表中的列(每一个属性也有一个name)
- 域(domain):对于关系的每个属性,都存在一个允许取值的集合,即为该属性的域。
- 域的原子性:要求对于所有关系r而言,r的所有属性的域都是原子的,即如果域中的元素被看作是是不可再分的单元则为原子的。多值属性(比如一个人有好几个联系电话)不是原子的、复合属性(比如一个人的姓名如果分为
firstname / lastname
则这个属性不是原子的)不是原子的。 - null表示值未知或不存在,空值给数据库的访问和更新带来很多困难,因此应尽量避免使用null
2.3 关系的概念
- 关系实例:一个关系的特定实例,即所包含的一组特定的行(变量的值)
- 关系模式:类型的定义(变量类型)
- 关系:(变量)
- 关系的无序性和不可重复性
二、 数据库模式
数据库模式;数据库的逻辑设计
数据库实例:给定时刻的数据库中数据的一个shortcut
三、 码(键)
目的: 为了提供一种区分给定关系中不同元组的方法,使用属性来表明。
一个元组的属性必须是能够唯一区分元组的,一个关系中没有两个元组在所有属性上的取值相同。
⚠️码代表的是整个关系的一种性质而不是单个元组的性质,关系中任意两个不同的元组都不允许同时在码属性上具有相同的值。码的指定代表了被建模事物在现实世界的约束。
- 超码:一个或多个属性组成的集合,这些属性的组合可以在一个关系中唯一地标识一个tuple
形式化描述:设R表示关系r模式中的属性集合,如果说R的一个子集K是r的一个超码,则限制了关系r中任意两个不同的tuple不会在K的所有属性上取值完全相等,即如果t1和t2在r中且t1!=t2,则t1.K!=t2.K
- 候选码:首先是是超码,其次它们的任意真子集都不能成为超码,这样的最小超码称为候选码。(即单独的最小不可分的超码即为候选码)
- 主码:被数据库设计者选中的、主要用来在一个关系中区分不同元组的候选码。(应该选择那些值从不或极少变化的属性、习惯上把主码属性列在其他属性前面、主码属性还加上下划线)
- 外码:一个关系模式可能在他的属性中包含另一个关系模式的主码,则这个属性在当前的关系中被叫做外码,当前关系被称为参照关系,另一个关系叫做被参照关系。(⚠️参照关系中的码必须在被参照关系中实际存在或者为null)
参照完整性约束:要求在参照关系中任意元组在特定属性上的取值必然等于被参照关系中某个元组在特定属性上的取值。(外键最大的作用)
四、模式图
一个含有主码和外码依赖的数据库模式可以使用模式图来表示。
图形化表示模式而已。
普通模式表示:
instructor(ID_,name,dept_name,salary)//下划线应该在ID的下面,表示ID是主键
五、关系查询语言
查询语言是用户从数据库中请求获取信息的语言。分为过程化语言和非过程化语言。
关系代数是过程化的,元组关系演算和域关系演算是非过程化的。
六、关系运算(重点)
- 关系运算总览:
- 关系代数:一种过程化查询语言,包括一个运算的集合,这些运算以一个或者两个关系为输入,产生一个关系为输出。
(一)基本运算
6.1.1 选择运算
- 选择运算选择出满足给定谓词的元组(tuple)
- 选择运算的表示:
sigma(relation)表示选择运算
,其中sigma的下标代表谓词
,sigma后面括号中的参数代表关系
- 可以使用各种运算符号在谓词中表示比较关系,还可以使用
and\or\not
和对应的数学符号将多个谓词合并成一个较大的谓词。
⚠️这里的select和在SQL中使用的SELECT不同,这里的select和SQL中的WHERE同义
6.1.2 投影运算
- 投影运算是一元运算,返回作为参数的关系,但是把某些属性排除在外。
- 投影运算的表示:
pi(relation)表示投影运算
,其中pi的下标表示列举希望出现的属性名
,pi后面括号中的参数代表关系
⚠️!在删除某些属性之后剩下的table的重复行要去掉
6.1.3 集合差运算
- 集合差运算使得我们可以找出在一个关系中而不在另一个关系中的tuple
- 集合差运算的表示
A-B
,A\B表示两个关系
-表示差运算
- 其实就是A-AB
6.1.4 笛卡尔积运算
- 笛卡尔积运算可以将任何两个关系的信息组合在一起。
- 笛卡尔积的表示:
AxB
,A\B表示两个关系
,x
表示两个关系的笛卡尔积 - 如果两个关系的属性没有交集可以直接组合,但是如果两个关系的属性有交集则应先rename然后再进行笛卡尔积运算
-⚠️ 数据库中的两张表就相当于两个集合,当我们使用SELECT语句查询数据的时候,DBMS内部就是以集合相乘的运算得出结果,但是这个时候会出现很多歧义,使用SELECT语句的查询结果很难符合实际情况,所以可以使用等值连接
来消除笛卡尔积带来的歧义
⚠️两个关系同样位置的属性相同
6.1.5 并运算
- 需要出现在两个关系中的数据之一,就可以将两个数据合并起来,并运算的符号和集合运算一致。
- 要使并运算有意义需要下列两个条件同时成立:(等目同元)
- 关系r和s必须是同元的,即它们的属性数必须相同
- 对于所有的i,r的第i个属性的域必须和s的第i个属性的域相同
6.1.6 更名运算
- 关系表达式的结果没有可供我们引用的名字,可以使用更名运算给数据库中的关系命名(允许使用其他名字来指代关系)
- rename的格式:
rho(expressions)
其中rho的下标表示对于关系的命名
,括号中的表达式
的结果作为命名的对象(关系)
- ⚠️也可以进行对应的属性更名操作,如果得到的表达式是n元的,则可以在下标使用
x(A1,A2,A3,...,An)
来给x的每一个属性命名
6.1.7 关系运算的组合
- 关系运算的组合也是一个关系
- 把多个关系运算组成一个关系代数表达式(比如一个关系运算的结果可以作为另一个关系运算的参数传入,就是关系运算的嵌套)
(二)附加的关系代数运算
为什么叫附加运算?因为这里使用的关系代数运算都可以用前面的基本运算进行表示,只不过,这里使用这些来简化操作,所以叫附加运算。
6.2.1 除运算
- r➗s适用于包含了“对所有的”此类短语的查询
- 作为除数的table中的属性将不在被除数的table中出现,而且最后作为被保留的被除数的table中的属性的tuple原来的tuple 中必须包含所有的除数中的属性对应的tuple的组合。
至少选择的话,直接除以1和3的,即使这个人有别的课比如123,这个人也可以被选择出来,即至少选择两门学科。
6.2.2 集合交运算
- 集合交运算和并运算的模式相同,即数学中集合的交运算的含义
- 同样要满足等目同元
6.2.3 自然连接运算
- 对某些笛卡尔积的查询进行简化常常是我们需要的,通常情况下对于笛卡尔积的结果需要一个选择的运算,该选择运算大多是要求笛卡尔积的两个关系在所有相同属性上的值相等,自然选择运算就是将笛卡尔积和选择两个运算和并成一个
- 自然连接运算首先求两个集合的笛卡尔积,然后基于两个关系模式中都出现的属性上的相等值进行选择,最后还要去除重复属性。
- 如果两个关系不含有任何相同的属性则就是笛卡尔积
- theta连接:在连接运算符的下标上添加交运算关系的谓词,这里就不是相等关系了,而是自己根据需要选择适合的谓词作为选择
6.2.4 赋值运算
- 通过给临时关系变量赋值的方法来写关系代数表达式会比较方便
- 使用赋值运算可以把查询作为一个顺序程序,该程序由一系列赋值加上一个其值被作为查询结果的表达式组成。对于关系代数查询而言,赋值必须是赋值给一个临时关系变量,对于永久关系的赋值形成了对数据库的修改。注意,赋值运算不能增强关系代数的表达能力,但是可以使复杂查询的表达变得简单。
(三)扩展的关系代数运算
可以实现一些不能用基本关系代数运算来表达的查询。
6.3.1 聚集函数
- 聚集函数输入值的一个汇集,将单一值作为结果返回。
- 常见汇集:
sum(S):返回求和
min(S):返回最小值
max(S):返回最大值
avg(S):返回平均值
count(S):返回集合中元素的个数
- 聚集函数的表达形式:
G(relation)
,其中G是“书法体G”,聚集函数使用类似sum(salary)
的形式表示在书法体G的下标,然后括号中是对应的关系(table) - 如果想要去除重复值使用
functionname_distinct
:确保去除重复值 - 分组:有的时候不想直接计算整个table中某一个属性全部的值的聚集函数值,而是再根据其他属性进行分类,然后得到最终的函数值,这个时候把分类的依据属性写到书法体G的前面作为下标(如果是多个聚集函数的话,可以对应给其指定多个分类依据属性,按照顺序写在书法体G前面即可)
- 聚集函数的结果是没有名称的:
1. 使用rename运算为其命名
2. 可以把重命名作为聚集运算的一部分
branch_name G sum(balance) as sum_balance (account)
6.3.2 外连接运算
- 连接运算的扩展,可以处理缺失的信息。外连接运算和前面的自然连接运算比较接近,不同之处在于它在结果中可以创建带有null的元组,以此来保留在连接中丢失的元组。
- 保留一侧关系中关于所有与另一侧关系的任意元组都不匹配的远足,再把产生的元组加到自然连接结构上
- 内链接(自然连接):只保留两个table相等的部分
- 左外连接,作为左侧参数的table中在右侧没有对应的部分使用null进行补充(以左侧参数的table为轴)
- 右外连接,作为右侧参数的table中在右侧没有对应的部分使用null进行补充(以右侧参数的table为轴)
- 全连接,左侧在右侧中没有的和右侧在左侧中没有的都使用null进行补充
6.3.3 广义投影
- 允许在投影列表中通过使用算术运算和字符串函数等对投影进行扩展
- 原来的投影只是将当前table中已存在的属性选择出来,但是现在在选择出来的基础上可以直接对这些属性进行操作
PIID,name,dept_name,salary/12(instructor)这里的salary/12
就是一个新创立的属性直接计算salary/12
查询实例
七、总结
- 关系数据模型:建立在table的集合的基础上,数据库用户可以对这些表进行查询,可以插入新元组、删除元组以及更新元组
- 关系的模式:指的是它的设计逻辑(包括属性,还可能包括属性类型和关系上的约束,比如主码和外码的约束)
- 关系的实例:特定时刻的内容
- 关系的超码、主码、外码、候选码
- 模式图
- 关系查询语言:定义了一组运算集,这些运算可以作用在表上,并输出表作为结果,这些运算可以组合成表达式表达所需的查询
- 关系代数,提供了一组运算进行数据库查询。