数据库
• 基本概念
– 数据(是有结构的)
描述客观事物的特征、性质的符号
比如人的照片就是数据,该数据描述了人的外貌特征,包括脸型、头发、眼型、唇形等。
– 数据项(数据的基本单元)
某事物的某特征/某性质(=项名+若干项值)
描述的 人的脸型:国字脸 就是照片的一个数据项。
– 记录型
描述事物若干特征/性质的数据项名的集合。
人的脸型、头发长度、眼型、唇形等集合就是记录型
– 数据记录
根据记录型规定描述一个事物若干特征/性质的数据项值的集合。
– 数据的特性
- 有“型”“值”之分
- 有定性表示与定量表示之分
- 数据类型与取值范围约束
- 数据具有载体和多种表现形式
– 信息
是数据处理的结果(经过加工处理的),以对决策有价值的数据形式表示。有一定含义。
– 数据与信息的关系
信息是数据的内涵,数据是信息的载体(数据表示的内涵就是一种信息,信息借由数据表示出来)
信息=数据+数据处理
– 数据库
长期存储在计算机内,可共享、有组织的数据集合,也是相关联的大量数据及数据间的集合
– 数据库管理系统DBMS
是位于用户与操作系统(OS)之间的,使人们能对数据库中的数据进行科学地组织、高效地存取和维护管理的一种数据管理软件。
– 数据库系统
在计算机系统引入数据库之后的系统构成
– 数据的独立性(逻辑独立性和物理独立性)
逻辑独立性:应用程序与逻辑结构独立
物理独立性:应用程序与物理存储独立
数据库系统的组成:硬件平台及数据库、软件(数据库管理系统、应用程序)、相关人员
DBMS的主要功能
– 定义、操纵、控制、维护
定义:提供定义语句,提供数据对象
操纵:提供操纵语句
控制:控制运行(安全性、完整性、并发性)
• 数据库技术的核心是数据处理
– 数据处理可分为数据计算和数据管理
• 数据管理的三个阶段及各阶段的特点
:高级数据库阶段(20世纪八十年代末开始)
数据管理 | 特点 | 主要特点 | 缺点 |
人工管理(20世纪50年代中期前) | 数据与程序一对一 | 数据由人工管理、不共享、不独立(数据用于科学计算) | |
文件管理(20十季50年代末-60年代中) | 多对多 | 数据可以长期保存、文件管理、文件多样化和结构化(数据用于科学计算和信息管理) | 数据联系较弱、独立性差、数据冗余度大 |
数据库管理(20世纪60年代-至今) | 一对多 | 独立性高、数据整体结构化、数据用数据模型定义,无序程序,数据共享度高,冗余少、提供了完整的控制功能 |
• 数据库的特点
– 结构化、独立性、共享性、控制功能
结构化:数据可变长、数据结构模型化,无需程序定义
独立性:逻辑独立、物理独立
共享性:减少冗余、避免不一致性、系统易于扩充
控制功能:提供数据的安全性保护、完整性检查、并发控制与数据库恢复
• 数据库系统的主要组成
– 数据库、数据库管理系统、应用程序、DBA
• 数据库系统的三级模式
目的:减少冗余、提高数据独立性、提高存储效率
– 内模式、模式、外模式(子模式)
内模式(一个数据库仅有一个):
也称存储模式,是数据库物理结构和存储方式的描述,是数据库内部表现形式
模式(数据库系统模式结构的中心):
也称结构模式或逻辑模式,是数据库中全体 逻辑结构和数据特征的描述,与结构数 据模型对应。
实例是模式的一个具体值,反应数据库在某 一时刻的状态,一个模式可以有多个实 例。
外模式:
也称子模式或者用户模式,是数据库用户可看见和使用的局部特征和逻辑结 构
关系:外模式是模式的子集,一个模式包含多个外模式,一个外模式可被多个应用系统使用,一个应用系统仅可以用一个外模式。
• 数据库的二级映像(数据独立性)
– 外模式/模式(提高逻辑独立性):映像定义通常包含在外模式的描述中。
– 模式/内模式(提高物理独立性):映像定义通常包含在内模式的描述中。
• 三级模式与二级映像的优点
- 保证数据独立性
- 方便用户使用、简化用户接口
- 保证数据库安全性
- 利于数据共享性
- 利于宏观上通俗地理解数据库系统的内部结构
章节测验点:
- 文件系统和数据库管理最主要的区别:文件管理不能解决数据冗余和数据独立性问题,而数据库系统可以解决。
- 内模式最接近外部存储设备,内模式(存储模式)目的是提高数据库物理层面的存储效率。
- 数据库系统的体系结构:三级模式和两级映像
- 物理独立性又指:用户的应用程序与存储在磁盘上数据库的数据是相互独立的。
- 数据库系统一般由数据库、数据库管理系统、应用程序、数据库管理员组成(最主要的组成部分)
第2讲 数据模型(数据库系统的核心)
• 基本概念
数据模型是对现实世界客观事物的数据抽象描述,可以确切反映事物、事物间及其相关特征的关系。
– 数据模型(数据库系统的核心)
– 关系模式、关系、属性、元组、候选键、外键、域、分量
• 数据模型的分类(根据抽象层次不同)
– 概念、逻辑、物理
-
概念数据模型(用户X设计者)
- 按照用户的观点对数据和信息进行建模,与具体的DBMS无关(E-R模型)
- 实体-联系(ER)模型
实体:客观存在并可相互区别的事物。
属性:实体具有的特征。
实体型:对有相同属性的实体的性质和特征的结构描述。
实体集:同一类型实体的集合
举例说明:汽车是实体型,汽车包含的汽车1、汽车2、汽车3是实体集
假设我们有以下实体集:
- "汽车1",车牌号为"ABC123",颜色为红色,品牌为奥迪;
- "汽车2",车牌号为"XYZ789",颜色为蓝色,品牌为宝马;
- "汽车3",车牌号为"DEF456",颜色为黑色,品牌为奔驰。
在这个例子中,"汽车"就是实体型,而"汽车1"、"汽车2"和"汽车3"就是在实体型"汽车"下具体存在的实体集
- 关键字:可以唯一标识这个实体集中每个实体的属性集合。
比如每个学生的学号可以唯一标识每个学生。
- 联系:实体之间的联系(实体集内部/实体集之间的联系)
- E-R图要点:
- E-R模型关系模式的转换:
实体型的转换
联系的转换
- 1:1:将其中一个实体型关系模式的主键属性添加到另一个实体的关系模式中,
A(a1,a2,a3)B(b1,b2,b3)AB关系为c----->A(a1,a2,a3,b1,c)
- 1:n:n的那一端的关系模式的主键属性加到少的一方的关系模型中
A:B=1:n A(a1,a2,a3)B(b1,b2,b3)关系为c ----->A(a1,a2,a3,b1,c)
- n:m:新建一个表,属性有两个实体关系模型的主键属性和两个实体的关系属性。
-
逻辑数据模型(结构数据模型、设计人员+数据库设计工具)
①、有具体的DBMS支持、按照计算机系统的观点对数据建模、使用DBMS实现
②、常用的结构数据模型:
-
层次模型
满足:只有一个根节点,结点只有一个双亲结点
优点:层次模型优先关系模型不低于网状模型;提供了完整性支持
缺点:只能表示1:n的关系,其他复杂
-
网状模型
满足:允许一个以上的结点无双亲,一个节点可以有多个双亲
优点:更直接描述现实世界,性能良好,存取效率高
缺点:DDL,DML语言复杂,结构复杂
-
关系模型!!!!!
关系模式:二维表表头,对应E-R图的实体
属性:二维表中的一列就是一个属性,属性的名称就是属性名
元组:二维表中除表头外的一行非空行
关系:一张二维表
候选键:一列属性的集合(可以唯一确定一组元组),择其一作为主键(关键字)
外键:关系中含有与另一个关系关键字相对应的属性
域:属性的取值范围
分量:元组中一个属性的具体值
优缺点看下表
关系数据模型的完整性约束:实体完整性、用户定义完整性、参照完整性
-
面向对象模型
数据库技术(以数据模型为主线发展)
数据库技术 | 采用的结构模型 | 特点 |
第一代--层次数据库和网状数据库技术 | 层次数据库和网状数据库 | -支持三级模式结构 -利用存储路径(指针)存储数据间关系 -数据定义语言DDL和数据操纵语言DML相对独立 -数据库语言采用过程性语言 |
第二代--关系数据库技术 | 关系数据模型 | -以关系代数作为理论基础,数据独立性强 -概念单一化,数据及数据间都用关系表示 -数据库语言采用说明性语言 优点: *建立在严格的数学理论基础上*概念单一*存取路径对用户透明*数据操作是集合操作 缺点: *存取路径透明导致查询效率低*提高查询效率的开发难度大 |
第三代--新一代数据库技术 | 面向对象模型 | -支持包括数据、对象以及知识的管理 -对其它系统开放 |
-
物理数据模型(DBMS完成)
数据最底层的抽象,用于描述数据在存储介质上的表示方法与存取方法,与具体的DBMS、操作系统、硬件都有关。
• 数据模型的三要素
– 数据结构、数据操作、完整性约束
- 数据结构:对数据静态特征的描述
- 数据操作:对数据动态特征的描述
- 完整性约束:操作后仍保持数据的一致性、准确性
关系数据模型
• 基本概念
域:一组具有相同数据类型的值的集合
– 笛卡尔积、广义笛卡尔积
笛卡尔积(集合相乘):给定一组域D1,D2,D3,……Dn,允许某些域是相同的,D1,D2,D3,……Dn的笛卡尔积为:D1 X D2 X D3 X ……X Dn={(d1,d2,d3……di)|di ϵ Di ,i=1,2,3……n},其中(d1,d2,d3……di)叫做一个i元组,该元组中di表示第i个分量。(不满足交换律)
笛卡尔积:用于将两个表中的每一行都与另一个表中的每一行进行组合,生成一张新表
广义笛卡尔积则允许多个表进行操作
笛卡尔积之后的表,行(元组)数表示基数,列(属性)数表示度数
– 关系(笛卡尔积的有一定意义、有限的子集)
– 基数、度
基数就是表示一个关系元组(行)的数量,一个表多少行数据。
度表示的是一个关系中属性(列)的数量,一个表有多少列属性
例题5:已知有关系R(A1, A2)={(a, 1), (b, 2), (c, 3)}, S(B1, B2,
B3)={(1, e, 0), (2, f, 3)},求R×S
R×S的度: n=2+3=5
R×S的基数=3×2=6
– 候选键、联合键、全键、主键、外键
联合键:两个或两个以上的属性组成的候选键
全键:全部属性组成的候选键
– 关系模式和关系的区别与联系
关系模式是对关系静态结构的描述(表头),是固定的。关系是关系模式的约束下多个实体的集合
• 完整性约束
– 实体完整性(每个元组对应的主键不为空)
– 参照完整性(如果有外键,每个元组对应的外键或者为空或者为被参照表元组某个值)
比如R(a, b, c )S(x, y, z, a) S参照表R,则a要么为空,要么是a属性列的任一个值。
说明:
-
被参照关系和参照关系不一定是不同的关系(有时参照自己某一属性)
-
被参照关系的主键与参照关系的外键必须定义在同一个域上
-
外键不一定要和对应的主键同名
– 用户定义完整性
用户根据具体应用对某一具体数据添加附加约束,也称为域完整性,比如定义电话号码必须是长度为11的数字
• 关系操作
关系代数:用代数运算来表达关系要求的查询和操作
关系演算:用谓词来表达关系要求的查询和操作
关系代数
- 相容:指满足两个关系R,S具有 ;R的第i个属性和S的第i个属性在同一个域上(根据两个表的数据类型和取值范围判断)。
-
传统的关系运算:并、交、差运算(相容条件下)、(广义)笛卡尔积
差运算就是取另一个表没有的部分。
-
专门的关系运算
-
选择运算(单目):关系R中选择满足条件的元组F组成新关系(水平方向选)
бF(R)={t | tϵ R ∧ F(t)}
бSgender=‘男’(Students)={t|tϵ Students ∧ Sgender=‘男’}
-
投影运算(单目):从关系R中选择需要的列A组成新的关系(垂直方向选)
ПA (R)=Пi1,i2,i3……ik(R)={t[A]|tϵR}
-
连接运算(双目):从两个关系的广义笛卡尔积选取满足一定连接条件的元组
-
除法运算
R/S的度=R的度-S的度
R/S表示的是R中所有符合S条件的元组
象集:
定义:给定关系R(x,z),x, z为属性组,若t[X]=x,x在R中的象集为:
Zx ={t [ z ]|tϵR,t[ X ]=x}
Пz(бR.X=x(R))从X中取出X的分量,去除,直流x在Z中的分量。
比如:
A | B | C |
a1 | b1 | c1 |
a2 | b2 | c2 |
a3 | b3 | c3 |
a1 | b1 | c3 |
a3 | b3 | c1 |
例题:
(1)、设一学号为2016115101的学生在2017学年第2学期选修了课程号为112p0098的课程且得分为68,将这些信息插入(交运算)关系Reports中
Reports ∪ { ‘2016115101’, ‘112p0098’, 2017, 2, 85 }
(2)、检索选修了所有(除运算)课程的学生编号和姓名
∏Sno, Sname ( Students ▷◁
( ∏Sno, Cno(Reports) ÷ ∏ Cno(Courses) )
)
(3)、在关系Reports中删除学号为2016210102,选课为’计算机网络’课程的元组
Reports -( ∏Cno ( σCname=‘计算机网络’ ( Courses) )
▷◁ σSno=‘2016210102’ ( Reports )
)
Delete from reports r, Course c where Sno=’2016210102’ and Cname=’计算机网络’ and r.Cno=c.Cno.
涉及到超过一个表,连接运算
查询优化(选择运算应尽早执行)
笛卡尔积的等价公式:AB=BA,A(BC)=(AB)C交换律和结合律
连接查询的等价公式:A∞B=B∞A 交换律和结合律
关系模式的规范化设计理论
• 基本概念
-
函数依赖定义1
® 设R(U)是属性集U={A1, A2,…,An}上的关系模式,X和Y是U的子集。若对R(U)的任一具体关系r中的任意两个元组t1和t2,只要t1[X]=t2[X]就有t1[Y]=t2[Y],则称“X函数确定Y”或“Y函数依赖于X” ,记作X→Y。
X就是Y的决定因素。
比如有关系R(A, B, C)={(a1,b1,c1),(a2,b2,c2),(a3,b3,c3)}
若t1[A](a1)=t2[A](a3)可以得出t1[C]c1=t2[C]c3,就说A确定C或者C依赖于A
® 小写字母r表示关系模式R(U)的对应的具体关系 (当前基本表的状态)® 注意:R(U)的一切具体关系r都要满足函数依赖的约束条件。
-
平凡函数依赖
X --> Y ,Y含于X(不含于就是非平凡函数依赖)
-
相互函数依赖 X <--> Y
X --> Y 且Y --> X
-
完全函数依赖 X ------> Y
X --> Y 且 X的真子集不能确定Y,则Y对X完全函数依赖
比如:{Sno, Cno}-->Grade Sno不能确定Grade,Cno也不能确定Grade
-
部分函数依赖 X -----> Y
X --> Y 且 X的真子集也可以确定Y,则Y对X部分函数依赖
比如:{Sno, Cno} -->Sname, Sno-->Sname
-
传递依赖 X ----> Y
X, Y, Z不相互包含,X -->Y, Y-->Z, Y不能确定X,则X --> Z
– 主属性、非主属性
主属性:包含任意一个候选键的属性称为主属性
非主属性:不包含任何一个候选键的属性称为非主属性或非码属性
主键又称为主码或者关键字
• 函数依赖
– 会判断依赖关系
关系模式规范化
规范化:通过模式分解将低级别的关系模式转换为若干个高级别的关系模式
范式包含以下几个:
- 第一范式(1NF)
所有属性都是不可再分的基本数据项。
-
第二范式(2NF)
属于第一范式,且每个非主属性完全依赖于候选键
非2NF的问题:插入/删除异常,更新复杂
非2NF模式转换(消除非主属性的部分依赖):用投影分解把原生关系模式分解为两个或多个关系模式。
比如R(Sno, Cno, Cname, Grade) (Sno, Cno)--->Grade,
Cno --->Cname
以上模式转换为:
R1(Sno, Cno, Grade)R2(Cno, Cname)
-
第三范式(3NF)
属于2NF,且每个属性不传递函数依赖于候选键
比如R(Sno , Sclass, Sloc),Sno --->Sclass ---> Sloc 不属于3NF
不存在非主属性至少属于第三范式
非3NF模式转换(消除传递依赖):提取出作为中间传递的属性 ,转换为:(Sno, Sclass)(Sclass, Sloc)
-
BC范式(BCNF)
每个非平凡函数依赖都的决定因素都必须包含候选键。也就是每个属性必须与候选键有直接关联
属于BCNF可得出结论:
- 所有非主属性都完全依赖于候选键
- 所有主属性完全依赖于不包含自己本身的候选键
大多数情况下,3NF就是BCNF,除以下情况可能不是:
关系中包含两个或以上联合候选键
候选键有重叠属性 eg.(Sno, Cno)(Sno, Tno)
BCNF是在函数依赖条件下模式分解所能达到的最高分离程度
- 第四范式(4NF)
- 第五范式(5NF)
数据库的安全性与保护
-
数据库数据不正确、被破坏的主要原因:
自然/人为、更新操作有误、并发操作引起的数据不一致性、数据库系统的软/硬件故障。
-
DBMS层提供的数据库安全和保护功能
-
安全性保护:防止非法用户非法使用,防止破坏、泄露、篡改
-
完整性保护:保证数据正确性、一致性
-
并发控制:保证多用户共享,数据库数据一致性
-
数据库恢复:配合备份使用
-
安全性保护
-
用户鉴别(最外层的安保措施):鉴定是否为合法用户
登录MYSQL服务器:MySQL -h 主机号 -u 用户名 -p
创建用户:create user if not exists 用户名 identified by 密码[,用户名 identified 密码……]
修改用户名:rename user 旧名 to 新名
删除用户:drop user 用户名;
-
存取权限控制:
权限级别:
列权限:与表中具体某列有关
表权限:与表所有数据有关
数据库权限:和其中一个数据库所有表有关
用户权限:和所有数据库有关
授权粒度:衡量授权机制是否灵活,粒度越细越灵活安全性越完善
-
视图机制:
限制用户使用数据的范围
特点:虚拟表、只存放定义(select)不放数据、数据随主表数据改变,相当于一个表
组成视图的属性列名要么全部省略要么全部指定。但在下列三种情况下必须明确指定组成视图的所有列名:
® 某个目标列不是单纯的属性名,而是集函数或列表达式。
® 多表连接导出的视图中有几个同名列作为该视图的属性列名。
® 需要在视图中为某个列使用新的更合适的名字
更新视图的限制
® 在一个基本表上建立的视图,只有包含基本表的主键才可以更新;® 一个视图最多只能有250个列;
® 不能在视图上建立触发器和索引;
® 对视图的一个更新语句只能影响一个基本表,所以由多表连接定义的视图不允许更新。
® 定义视图语句不能使用UNION操作符。
® 视图定义中用到GROUP BY子句或包含集合函数、计算列的数据不能修改。
-
跟踪审查(事后监视):MySQL日志
-
数据加密存储和传输
-
完整性保护(保护数据的正确性、一致性、相容性)
安全性:对象为非法用户
完整性:对象为非法语句
DBMS完整性控制应有的功能:
定义功能:提供约束的命令/工具
检查功能:检查用户操作是否违背约束
保护功能:违背后自动采取措施
完整性约束的分类:
据时机:立即执行(语句结束后)、延迟执行(事务结束后)
据控制方法:实体/参照/用户定义完整性
-
并发控制(衡量DBMS重要指标之一)
以事务为单位
事务(ACID)的特性:原子性、一致性、隔离性、持续性
串行访问:一个结束另一个开始……看上面
事务
事务的四大特性:
-
原子性:要么全成功,要么全失败
-
一致性:事务完成时,所有的数据状态一致
-
隔离性:保证十五不受并发操作的影响,独立
-
持久性:事务提交/回滚后,对数据库的改变是永久的
并发控制:串行访问(一个结束下一个),并行访问(各事务执行时间有重叠)
并发事务的问题:
- 脏读:读到其他事务没提交的数据
- 幻读:查询时无数据,要插入时有了数据
- 不可重复读:同一条记录,两次查询结果不同
事务的隔离级别:
- 序列化:依次执行,都可以避免
- 可重复读(默认):可避免脏读和不可重复读
- 提交读:仅可以避免脏读
- 未提交读:相当于无隔离
一些个小语句:
循环语句
-- ------------------------------while loop repeat ------------------------------------------------
/* [标签:]while 条件 do
要执行得操作
end while [标签]*/
-- 例如添加指定条数据
delimiter %%
create procedure selec10(in account int),
begin
declare i int default 1;
lable:while i<=account do
insert into user(name,password)values('张三','1234312');
set i=i+1;
end while lable;
end %%
delimiter ;
call selec10(3);
-- while_leave
-- 添加 if 条件 then leave [标签] end if;
delimiter %%
create procedure selec11(in account int)
begin
declare i int default 1;
lable:while i<=account do
insert into user(name,password)values('张三','1234312');
if i>5 THEN
leave lable; -- 如果i>5,立刻退出循环,相当于break
end if ;
set i=i+1;
end while lable;
end %%
delimiter ;
call selec11(10);
-- 跳过本次循环 iterate [标签];
delimiter %%
create procedure selec12(in account int)
begin
declare i int default 0;
lable:while i<=account do
set i=i+1;
if i=5 THEN
iterate lable; -- 如果i=5,立刻跳过本次循环,相当于continue
end if ;
insert into user(name,password)values('张三',i);
end while lable;
end %%
delimiter ;
call selec12(10);
-- ---------------------------------------repeat 循环-----------------------------------------------
/*
[标签:]repeat
语句
until 结束条件
end repeat [标签];*/
-- 清空表
truncate table user;
delimiter $$
CREATE PROCEDURE selec13 (IN account INT)
BEGIN
DECLARE
i INT DEFAULT 1 ;
REPEAT
SET i = i + 1 ; INSERT INTO USER (NAME, PASSWORD)
VALUES
('张三', i) ; UNTIL i >= account
END
REPEAT ;
END$$
delimiter ;
call selec13(5);
select * from user;
-- ------------------------loop--------------------------------
/*
[标签:]LOOP
循环体
if 条件 then
leave [标签:]
end if ;
end loop;
标签要加上
*/
delimiter $$
create procedure selec14(in account int)
begin
declare i int default 0;
loop
insert into user(name,password) values('李四',i);
set i=i+1;
if i>=account then
leave ;
end if;
end loop;
end $$
delimiter;
delimiter $$
create procedure selec14(in account int)
begin
declare i int default 0;
label:loop
insert into user(name, password) values('李四', i);
set i = i + 1;
if i >= account then
leave label;
end if;
end loop;
end $$
delimiter;
call selec14(10);
select* from user;
-- ------------------------------游标-------------------------------------
-- 输入部门名,查询该部门的员工编号,姓名和薪资
delimiter $$
create procedure selec15_cursor(in dep_name varchar(20))
begin
-- 定义局部变量
declare var_empno int;
declare var_ename varchar(20);
declare var_sal decimal(8,2);
-- 声明游标
declare var_cursor cursor for
select empno,ename,sal
from emp,dept
where dname=dep_name and dept.deptno=emp.deptno;
-- 打开游标
open var_cursor;
-- 取值(一次只能取一行值)
fetch var_cursor into var_empno,var_ename,var_sal;
select var_empno,var_ename,var_sal;
-- 关闭游标
close var_cursor;
-- 删除游标
-- drop var_cursor if exists;
end $$
delimiter;
call selec15_cursor("销售部");