一、基本概念
1.1数据库与数据库管理系统
数据:描述事物的符号记录(声音、文字、图像、视频等)。
数据库系统(DBS):数据库(DB)、硬件、软件、相关人员构成;
1)数据库:存储在计算机内有组织可共享的大量数据集合(数据关联密切、共享性高、冗余度低、易扩充);
2)硬件:构成计算机系统的各种物理设备,包括存储数据所需要的外部设备;
3)软件:包括操作系统、数据库管理系统(DBMS)、应用程序。
4)相关人员:一共分为四类,系统分析员&数据库设计人员、程序员、最终用户、数据库管理员(DBA);
DBMS的功能:数据定义(DDL);数据库操作(DML);数据库的运行和管理;数据的组织、存储和管理;
数据库的建设和维护;其他功能;
DBMS的特征:数据结构化且统一管理、有较高的数据独立性、数据控制功能(安全性、完整性、并发控制、故障恢复)
DBMS分类(三类):关系型数据库系统、面向对象的数据库系统、对象关系数据库系统;
数据库的三级模式结构(三级模式二级映象):
1)概念模式(模式):数据库中全部数据的逻辑结构和特征的描述;
2)外模式(子模式、用户模式):用户操作数据库的接口,是对局部数据的特征描述;
3)内模式(存储模式):是数据在数据库内部的表示方式;
模式/外模式映象:保证逻辑独立性;模式/内模式映象:保证物理独立性;
当数据库的内模式发生改变时,只需对模式/内模式映象做出相应的改变,可保证应用程序不变(物理独立性)
当数据的逻辑结构发生变化后只需对模式/外模式映象做出相应的改变,可保证应用程序不变(逻辑独立性)
1.2大数据(big data)
定义:无法用现有技术提取、存储、搜索、共享、分析和处理的海量的、复杂的数据集合;
大数据的特征:大量化(数据体量巨大)、多样化(数据类型繁多)、价值密度低(数据多但有价值的数据少)
快速化(处理速度快)
大数据面临的挑战:软件和数据的处理能力、资源的共享与管理、数据处理的可信力;
二、数据模型
2.1数据模型的基本概念
常用数据模型的分类:概念数据模型和基本数据模型(层次、网状、关系、面向对象、对象关系、半结构化);
概念数据模型是对现实世界到信息世界的第一层抽象,主要用于数据库的设计(E-R图)。基本数据模型则是对现实
世界数据的抽象,用于DBMS的实现。
数据模型的三要素:数据结构、数据操作、数据的完整性约束;
E-R模型(实体-联系模型):实体用矩形框表示,用于描述现实世界中客观存在并且可以相互区别的事物,联系用
菱形表示,菱形框内注明联系名,用无向边连接对应实体并注明实体与实体之间的关系(1:1、1:n、m:n),属性用
椭圆表示,椭圆内部为属性名并与对应的实体相互连接。
在E-R模型中属性分为以下四类:简单属性/复合属性、单值属性/多值属性、NULL属性(表示未知)、派生属性;
E-R模型中的主要构件:矩形(实体)、菱形(联系)、椭圆(属性)、线段(连接实体与属性或实体与联系)
层次模型:采用树形结构来表示数据和数据之间的关系,每一个结点表示一个记录(实体),记录与记录之间通过
线段相连,除了根结点外其他的结点有且只有一个双亲结点(可以表示1对多的关系,多对多表示较复杂);
网状模型:结点可以无双亲也可以有多个双亲(可以表示多对多的关系);
关系模型:相当于一个二维表,关系数据库常采用此模型;
面向对象模型:对象/对象标识、封装、对象属性、类和类层次、继承;
每一个对象有唯一的对象标识,其内部封装了其状态和行为,其他对象不可见,对象与对象之间只能通过消息传递。
类是具有相同属性和方法的对象集,每一个对象都是类的一个实例类由于继承产生层次,子类可继承父类(超类)
的属性和方法,并可派生出自己特有的属性和方法;
三、关系代数
3.1关系数据库的基本概念
属性和域:实体的某些特征称之为属性,属性的取值范围称之为域;
笛卡尔积与关系:设D1,D2,...,Dn为任意集合,则定义D1,D2,...,Dn的笛卡尔积为{(d1,d2,...,dn) | di属于Di }
这里的di为元组的一个分量,笛卡尔积的元素个数为构成其的子集合的元素个数的乘积(笛卡尔积可用二维表表示);
例题1:D1={0,1},D2={a,b},D3={c,d}求D1,D2,D3的笛卡尔积
M={(0,a,c),(0,a,d),(0,b,c),(0,b,d),(1,a,c),(1,a,d),(1,b,c),(1,b,d)};|M|=8(元素个数)
3.2关系的基本概念
目或度:关系中属性的个数;
候选码:唯一能标识一个元组的属性或属性组;
主码:在多个候选码中选择的其中一个称之为主码;
主属性:包含在任何候选码中的属性称之为主属性,反之为非主属性;
外码:关系模式中的属性/属性组并非其码,而是其他关系的码,则该属性/属性集称之为此关系的外码;
全码:关系模型中所有的属性是这个关系模式的候选码,则此候选码称之为全码;
关系的三种类型:基本关系(基本表\基表)、查询表(查询结果对应的表)、视图表(由基本表或其他视图导出的表);
定义关系模式:R(U,D,dom,F),R为模式名,U为属性名集合,D为属性的域,dom为属性向域的映象
F为属性间的依赖关系集合;
完整性约束:实体完整性、参照完整性、用户定义完整性;
在实体完整性中主属性不能为null,参照完整性要么有参照表要么为null;
3.3关系运算
关系数据语言:关系代数、关系演算(元组关系演算和域关系演算)或具有两种性质的语言;
关系代数使用的运算符有集合运算符、专门关系运算符、算数运算符、逻辑运算符;
传统的集合运算符:并、交、差、笛卡尔积;专门关系运算符:选择、投影、连接、除;
(重点1)五种基本的代数运算:并、差、笛卡尔积、选择、投影
并:R与S具有相同的关系模式(结构相同),则RUS={ t | t ∈R v t∈S }
差:R与S具有相同的关系模式(结构相同),则R-S={ t | t∈R ^ t∉S } (会出现不/没有等字样)
笛卡尔积:R为n目关系,S为m目关系,则由两者产生的笛卡尔积为m+n目的关系。RxS={<tn,tm>| tn∈R,tm∈S }
投影:是从关系垂直方向的演算,A为关系R中的属性组,记πA(R)为在这几列上的投影,πA(R)={ t[A] | t∈R}
选择:是从关系水平方向的演算,选取满足条件的指定元组记为бF(R),бF(R)={ t | t∈R ^ F=true } F为布尔表达式;
(重点2)扩展的代数运算
交:R与S具有相同的关系模式(结构相同),则人R^S={ t | t∈R ^ t∈S } 显然R^S=R-(R-S)=S-(S-R)
连接:连接分为等值连接,非等值连接,自然连接(特殊的等值连接)三种;
等值与自然连接的区别:等值连接保留原表的所有列值,自然连接连接列会去除相同的属性列;(结果列值不同)
除:同时在水平和垂直方向进行的运算。假设有关系R(X,Y)和S(Y,Z)在这里的X,Y,Z为属性组R÷S满足在X上的分量
值x的象集Yx包含关系S在属性组Y投影的集合,即R÷S={ t[x] | t∈R ^ πY(S) 真包含于 Yx }
(一般会出现,包含/全部等字样)
广义投影:允许在投影中使用算数运算;(实现了列值的算数运算)
外链接:包含左外连接、右外连接、全外连接;
全外连接左右两侧均保留没有的赋予null值;左外连接保留左侧所有数据,右侧没有匹配的赋值为null;
右外连接保留右侧所有数据,左侧不匹配的赋值为null;
四、关系数据库SQL
sql是包括数据定义、数据查询、数据操纵、数据控制于一体的一种通用的功能强大的关系数据库的标准语言;
sql的特点:综合统一、高度非过程化、面向集合的操作方式、语法简单,易学易用;
数据查询 | select |
数据定义 | create、drop、alter |
数据操纵 | insert、update、delete |
数据控制 | grant、revoke |
sql中对应的三级模式结构:视图对应外模式,基本表对应模式,存储文件对应内模式;
sql的基本组成: 数据定义语言、数据操纵语言、事务管理、嵌入式/动态SQL、完整性、权限管理;
数据定义(DDL)提供了定义/删除/修改关系模式和视图;数据操纵(DML)提供增删改查命令;
SQL的数据定义(create/alter/drop)
语句格式:#创建表
create table 表名(
<列名><数据类型>[完整性约束条件],
<列名><数据类型>[完整性约束条件],
......
[表级完整性约束条件]
);
设定主键 primary key (主键属性组)
设定外键 foreign key (外键属性组) references 表名(依赖属性组)
NULL 空值; unique 唯一性约束; not null 非空;
语句格式:#修改和删除表
alter table 表名 add<新列名><数据类型>[完整性约束条件] #在表中增加新列
drop [完整性约束名] #删除约束
modify<列名><数据类型> #修改指定列的数据类型
drop table 表名 #删除整个数据表
语句格式:#索引的建立与删除
create [unique] | [cluster] index 索引名 on 表名(列名[次序],...)
次序有两种ASC升序,DESC降序,默认为升序;
unique唯一性约束,每一个索引只对应一条记录;
cluster建立聚簇索引索引项顺序与表中记录的物理顺序一致;
drop index 索引名 #删除索引
语句格式:#视图的创建与删除
create view 视图名(列表名)
as select 查询语句 [with check option]
with check option 表示对update/insert/delete操作时保证更新、插入、删除满足视图定义的谓词条件
即子查询中的条件表达式;
drop view 视图名 #删除视图
索引的作用:1)通过创建唯一索引可以保证数据记录的唯一性;2)加快数据的检索速度;
3)加快表与表之间的连接;4)使用order by和group by子句中检索数据时,减少排序和分组时间;
视图(虚表)的优点及作用:1)简化用户对数据的操作; 2)使不同用户以不同方式看到不同或相同的数据集;
3)提供简单有效的安全机制;4)满足不同用户对数据库的不同数据需求;
(注:定义视图的查询语句可以是复杂的select语句,但通常不允许有order by子句或者distinct去重)
SQL的数据查询(select)
语句格式:#数据查询
select all | distinct <目标列表达式>...
from 表名/视图名
where 条件表达式 #进行初步筛选
group by <列名>
having <条件表达式> #用于分组后的筛选
order by <列名>[asc | desc] #根据指定列值进行排序
子查询(嵌套查询):查询语句可以嵌套在另一个查询块中(支持多层嵌套)。
更名操作:使用as或者空格实现对查询字段或表的名称修改;(old_name as new_name | old_name new_name)
聚集函数名 | 作用 |
count(*) | 统计元组个数/用于计数 |
sum(列名) | 计算一列的和 |
avg(列名) | 计算一列的平均值 |
max(列名) | 求一列最大值 |
min(列名) | 求一列最小值 |
分组查询(group by子句):group by 列名 根据指定列进行分组操作,如需要对分组元组进行筛选则用having操作;
字符串操作(like):‘_’表示匹配单个字符,‘%’匹配任意多个字符;
元组为空NULL的注意事项:对求和/平均值/计数没有影响,不能用于最大/最小值;NULL值在分组中也会被看为一组;
SQL的数据更新(insert&update&delete)
语句格式:#插入
insert into 表名([<列名>,...]) values([值列表]);
或
insert into 表名(列表名) select 查询语句;
语句格式:#删除
delete from 表名 [where 条件表达式]; #没有where则删除表中所有数据
语句格式:#更新
update 表名 set 列名=列值,...
[where 条件表达式]
SQL访问控制(grant&revoke)
数据控制是指用户对数据的存储权利,由DBA决定;
DBMS应具有grant和revoke进行授予和回收权限;
对象 | 对象类型 | 操作权限 |
属性列 | table | select/insert/update/delete |
视图 | table | select/insert/update/delete |
基本表 | table | select/insert/update/delete/alter/index |
数据库 | database | createtab |
权限授予格式:
grant 权限 on [对象类型 对象名] to [用户,...]
权限回收格式:
revoke 权限 on [对象类型 对象名] from [用户,...]
all privileges 代表所有的权限都授予或者回收;
嵌入式SQL
EXEC SQL<sql语句> or EXEC SQL<sql语句> END-EXEC
嵌入式SQL与主语言之间通信的三种方式:
1)SQL通信区向主语言传递SQL的执行状态信息,使得主语言能根据此信息控制程序流程;
2)主变量(共享变量),主变量由主语言程序定义,引用时为与sql属性名相互区别要在主变量前加“:”;
3)游标SQL语言是面向集合的,引入游标通过游标指针来获取对应的记录;
五、关系数据库的规范化
5.1函数依赖&基本概念
函数依赖:设R(U)为属性集U上的关系模式,X,Y是U的子集。对任意一个关系不可能存在两个元组在X上相同,
但在Y上不同(一个X对应确切的一个Y值)X决定Y,记做X→Y;
非平凡函数依赖:若X→Y,但Y不是X的子集,则X→Y为非平凡函数依赖;
平凡函数依赖:若X→Y,Y是X的子集,则X→Y为平凡函数依赖(显然成立);
完全函数依赖:若X→Y,但X的任意子集都不能得到Y,则Y对X完全函数依赖;(没有子集导出Y)
部分函数依赖:若X→Y,但X的存在一子集能得到Y,则Y对X部分函数依赖;(有子集导出Y)
传递函数依赖:若X→Y,Y→Z,且Y不是X的子集,则Z对X传递函数依赖;
码:关系R(U)中,K→U,且对于K的任意真子集 K' 都不能得到U,则K为候选码,当有多个候选码的情况下
选定其中一个作为主码,候选码通常也称为候选关键字;
主属性/非主属性:包含在任一候选码中的属性称之为主属性,反之称为非主属性;
外码:R(U)中的属性或属性组X不是R的码,但X是另一关系的码,则称X为外码;
自反律 | 自己推自己,Y是X的子集,则X→Y |
增广律 | X→Y且Z为U的子集,则XZ→YZ |
传递律 | X→Y,Y→Z则X→Z |
合并规则 | X→Y,X→Z则X→YZ |
伪传规则 | X→Y,WY→Z则WX→Z |
分解规则 | X→Y,Z为Y的子集,则X→Z |
5.2规范化(三种范式)
第一范式(1nf):关系R中每一个分量都是不可在分的数据项(二维表),通常情况下都满足1nf;
1nf存在的问题:1)冗余度大;2)插入、删除、更新异常;
第二范式(2nf):首先先满足1nf,且对于每一个非主属性完全依赖于码。消除非主属性对码的部分函数依赖;
第三范式(3nf):关系R中不存在码X,属性组Y,非主属性Z(Z不属于Y)使得X→Y,Y→Z成立;
消除了非主属性对码的传递函数依赖;
5.3模式分解
分解应具有的特性:1)保持无损连接;2)保持函数依赖;
六、数据库的控制功能
事务:一个操作序列,要么全部完成,要么什么也不做,是数据库环境中不可分割的逻辑工作单位。
(注:事务 != 程序,两者是不同的概念,一般一个程序可包含多个事务)
SQL定义事务的语句:
1)begin transaction 事务开始; 2)commit 提交事务; 3)rollback 回退事务;
事务的特性(ACID):原子性、一致性、隔离性、永久性;
原子性:事务是原子的(要么全部完成,要么什么也不做)
一致性:事务的执行结果必须保证数据库从一个一致性状态转变到另一个一致性状态(只包含成功事务提交结果);
隔离性:不同的事务之间互不影响,相互隔离;(多事务并发执行,每一事务的过程对其他事务不可见)
永久性:事务一旦成功提交就永久有效;
数据库的关键技术(建立冗余数据)即数据备份;
常见的故障类型:事务内部故障,系统故障(软故障),介质故障(硬故障),计算机病毒;
备份方法:恢复的基本原理是“建立冗余数据”,其方法是数据转储和登记日志文件;
恢复的步骤:1)反向扫描日志文件,查找事务的更新操作;
2)对事务执行更新操作的逆操作;3)重复1和2步骤直到事务的开始标志;
并发操作带来的问题:丢失修改,不可重复读,读脏数据;
如上图a道所示,T1与T2两个事务都是对A进行减1操作,但最后结果却相同,举个例子,现实生活中
就是买票两个人买了同一张票,造成丢失修改现象;
如上图b道所示,T1事务读取AB值进行+运算,T2对B进行读取和修改,导致T1事务对待同一数据AB运算产生了不同
结果,影响了不同事务之间的独立性,造成不可重复读现象;
如上图c道所示,T1事务在最后执行rollback操作,导致T2事务做了很多无用操作;
并发控制技术:封锁,锁分为排它锁(X锁,写锁)或共享锁(S锁,读锁)
排它锁:若事务T对数据对象A加X锁,则只允许T对A进行读取和修改,其他事务不能对A操作,直到T完成解锁;
共享锁:若事务T对数据对象A加S锁,则只允许T对A进行读操作不能进行写操作。其他事务也可以对A加S锁,在
事务T释放S锁之前不能对A 进行修改;
活锁和死锁:死锁两个事务相互竞争资源导致事务无法进行的现象称之为死锁,反之为活锁;
封锁粒度:封锁对象的大小称之为封锁粒度;(对象可以是逻辑单元、元组、数据库等)
一级封锁协议 | 在事务修改数据R之前必须对其加X锁,直到事务结束时释放 (解决丢失修改问题); |
二级封锁协议 | 在一级协议的基础上,加上事务T在读数据R之前必须先对 其加S锁,读完后释放S锁(解决读脏数据问题); |
三级封锁协议 | 在一级封锁协议的基础上,加上事务T在读数据R之前对其加 S锁,直到事务完成时释放S锁(解决所有问题); |
并发调度的可串行性:多事务的并发执行是正确的,当且仅当其结果与某一次序串行执行的结果相同,则称
这种调度策略是可串行化的调度;