目录
数据库原理复习 1
一.基础 1
二.语句查询 4
语法 4
三.简答题 7
1.视图,表,之间的区别 7
2.事务 9
3.游标使用步骤 9
4.属性及闭包计算 9
5.触发器与存储过程 10
6.数据库设计(重点) 10
四.应用题.范式 11
1.求候选码 11
2.范式 12
3.分解成第几范式 14
五.E-R图设计,以及转换成关系模式 15
1.DB:数据库
DBMS:数据库管理系统(数据库系统核心,管理和控制数据)
DBS:数据库系统
2.人工管理阶段
文件系统管理阶段:程序与数据有了一定独立性
数据库系统管理阶段
3.数据库系统特点:
数据结构化、共享高、冗余低、易扩充、数据独立性高
4.数据模型:概念模型(如E-R模型)、逻辑模型(如层次、网状、关系模型)、物理模型
5.数据库系统的三级模式:外模式、概念模式、内模式。
外模式:即用户模式,局部数据。一个数据库可有多个外模式。
概念模式:所有用户的公共数据视图。一个数据库只有一个概念模式。
内模式:物理结构和存储结构的描述。一个数据库只有一个内模式。
6.数据库的二级映像:
外模式 / 模式映像:保证程序与数据的逻辑独立性。
模式 / 内模式映像:保证数据的物理独立性。
关系的完整性:实体完整性(主码唯一且不为空)、参照完整性(参照属性能找到或取空值)、用户自定义完整性
8. 两个关系R、S能进行并、交、差运算,必须有相同的属性个数,即并相容性。
9.关系运算:
选择(σ):选出一行。
投影(π):投出一列。
连接、除
10. 平凡函数依赖:X–>Y,Y是X的子集。
非平凡函数依赖:X–>Y,Y不是X的子集。
完全函数依赖:X–>Y,设Z是X的真子集,没有Z–>Y。
部分函数依赖:X–>Y,设Z是X的真子集,有Z–>Y。
传递函数依赖:X–>Z,有X–>Y和Y–>Z,且无Y–>X。
11. 左外连接:以左表为主表,右表中没数据的为null
右外连接:以右表为主表,左表中没数据的为null
12. 索引:数据库的附加表,建立列的值和记录地址的映射,以加快查询速度
13. 聚集索引和非聚集索引区别?
聚集索引物理存储连续;非聚集索引是逻辑上的连续,物理存储不连续;
聚集索引一个表只能有一个;非聚集索引一个表可有多个。
14. 并发操作引发的问题
丢失更新问题:同时读同一数据并修改。
读“脏”数据:读取了未提交事务的数据。
不可重复读(幻读现象):两次读同一数据不一样,另一个事务修改了数据。并发操作破坏了事务的隔离性。
15. 并发控制措施:封锁
16. 写锁(排他锁):即X锁,已有X锁或S锁时,不能加X锁
读锁(共享锁):即S锁,只有S锁时,可加S锁
17. 死锁预防:一次封锁法、顺序封锁法
可串行化调度:结果正确,当且仅当其结果与按某一顺序的串行执行的结果相同时,该策略为可串行化调度策略。两段锁协议可保证并发调度可串行化。
20.两段锁协议:先封锁,后解锁
遵循两段锁协议,一定可串行化;可串行化,不一定遵循两段锁协议
遵循两段锁协议,仍可能发生死锁
21.数据库故障类型
事务内部故障:非预期,不能由程序处理。如运算溢出、死锁。
系统故障(软故障):如硬件错误、停电。
介质故障(硬故障):外存故障,如磁盘损坏。
计算机病毒
22.数据转储:静态转储、动态转储
23.“先写日志文件”原则
24. 安全控制:确认登录账户,确认访问数据库权限,确认操作数据库权限。
用户分类:系统管理员、数据库对象拥有者、普通用户。
角色:一组具有相同权限的用户。
25. 备份类型
完整备份:所有数据库信息备份
差异备份:对最近一次数据库备份发生变化的数据进行备份
事务日志备份
备份内容:系统数据库、用户数据库、事务日志
并发:
连接数据库:mysql -h localhost -u root -p
创建数据库:create database 数据库名;
显示数据库:show databases;
删除数据库:drop 数据库名;
使用数据库:use 数据库名;
显示当前数据库的所有表:show tables;
插入数据:
insert into table_name
( field1, field2,…fieldN )
values
( value1, value2,…valueN );
update子句:
update table_name set field1=new-value1, field2=new-value2
[where Clause];
delete子句:
delete from table_name [where Clause];
查询:
查询数据:
select column_name,column_name
from table_name
[where Clause]
[LIMIT N][ OFFSET M];
where子句:(可以加and,or,in,not in)
select field1, field2,…fieldN from table_name1, table_name2…
[where condition1 [AND [OR]] condition2…;
like子句:( _表示一个未指定字符,%指定多个不定符)
SELECT * from table_name where runoob_author LIKE ‘%COM’;
union子句:
select 语句 union select语句
排序:( ASC:升序,DESC:降序,默认升序)
语法:select * from table_name order by submission_date ASC;
分组:(GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,max,min等函数。)
语法:select column_name, function(column_name)
from table_name
where column_name operator value
GROUP BY column_name;
举例:SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
is判断是否为空值
distinct 去重
group by 分组 (用函数时,条件筛选用having而不是where)
语法: SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
having:用于gourp by 条件筛选
等值连接(获取两个表中字段匹配关系的记录。):SELECT a.runoob_id, a.runoob_author,
b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author =
b.runoob_author;
左连接(获取左表所有记录,即使右表没有对应匹配的记录。):SELECT a.runoob_id,
a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON
a.runoob_author = b.runoob_author;
右连接( 与 LEFT JOIN
相反,用于获取右表所有记录,即使左表没有对应匹配的记录。):SELECT a.runoob_id,
a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON
a.runoob_author = b.runoob_author;
as 起别名,填在数据库名后面
exits存在 not exits不存在
union并集 intersect 交集 except差集
约束:
primary key 主键(不能为空,且不能重复)
foreign key 外键(用法:foreign key(pid) references student(id))
not null 不为空
unique 唯一
default 默认值
表:是数据存储的最常见和最简单的形式,是构成关系型数据库的基本元素。表的最简单形式是由行和列组成,分别都包含着数据。表在数据库占据实际的物理空间,可以是永久的或是临时的。
视图:是一个或多个表依照某个条件组合而成的结果集
联系与区别:
视图是已经编译好的sql语句,而表不是。视图没有实际的物理记录,而表有。
表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表
表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在
基表中的数据发生变化,从视图中查询出的数据也随之改变,视图的修改影响基表的数据,但视图的删除不影响基表
表是概念模式,视图是外模式
概念:用户定义的一个数据操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单元。
事务四大特性(简称ACID) :(重点)
原子性(Atomicity):事务包含的操作全部成功或者全部失败
一致性(Consistency):数据库从一个一致性状态变到另一个一致性状态
隔离性(Isolation):事务互相隔离互不干扰
持久性(Durability):事务提交后数据应该被永久的保存下来,出现宕机等故障后可以恢复数据
声明游标。使用T-SQL语句生成一个结果集,并且定义游标的特征,如游标中的记录是否可以修改。
打开游标。
从游标的结果集中读取数据。从游标中检索一行或多行数据称为取数据。
对游标中的数据逐行操作。
关闭和释放游标。
首先我们要知道闭包是什么(直白:闭包就是由一个属性直接或间接推导出的所有属性的集合):
设有关系模式R(U),U是属性集,F是函数依赖集,X⊆U。F+中所有X->A的A的集合称为X的闭包,记为X+。
ps:可以理解为X+表示所有X可以决定的属性
属性集闭包求法
下面介绍的是比较简单传统的闭包求法
求取属性集闭包的步骤:
1.设要求的闭包属性集是Y,把Y初始化为X.
2.检查函数依赖集F中的每个函数依赖A->B,如果属性集A中的所有属性都在Y中,而B中有属性不在Y中,则将其加入到Y中。
3.重复第二步,直到没有属性可以添加到Y中为止。最后得出的Y就是X+。
*例子:*设有关系模式R(M,N,X,Y,Z)其依赖集F={M->H,H->Z,Y->Z,N->Y,Z->M}。求M+,MH+
第一步:设要求的闭包属性集是Y,把Y初始化为X.
令X={M},我们先看M->H,由于函数依赖M->H左边的所有属性都在X中,而右边H不在X中,所以可以把H添加到X
中,此时X={M,H}
然后按照顺序我们再看H->Z,我们不难发现函数依赖H->Z左边的所有属性都在X中,右边的属性Z又不在X中,仍旧添加,这时X={M,H,Z}
下一个
Y->Z,可以发现Y属性不在X中,条件不满足
N->Y,可以发现N属性不在X中,条件不满足
Z->M,Z属性在X中条件满足,但右边M也在X中条件不满足。
属性判断完 ,那么属性M的闭包:M+=MHZ。
存储器:基本表被在修改的时候通过事件触发而执行的存储过程.
存储过程:一种数据库对象,将负责不同功能的语句分类放置起来,以便能反复使用.
触发器与存储过程的区别:
触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关。当一行被插入、更新或者删除时触发器才执行,同时还取决于触发器是怎样创建的,当UPDATE发生时使用一个更新触发器,当INSERT发生时使用一个插入触发器,当DELETE发生时使用一个删除触发器。
1.需求分析: 进行数据库设计首先必须准确了解和分析用户需求
2.概念结构设计:对用户需求进行综合,归纳与抽象,形成了一个独立于具体DBMS的概念模型。
3.逻辑结构设计:将概念结构转换为某个DBMS所支持的数据模型,设计E-R图
4.模式求精:对逻辑结构设计进行优化
5.物理结构设计:为逻辑数据结构模型选取一个最适合应用环境的物理结构
6.应用与安全设计:数据库系统的性能,并进一步调整和修改数据库。
函数依赖:
设R(U)是属性集U上的关系模式,X、Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称Y函数依赖于X或X函数确定Y。
完全函数依赖:
设R(U)是属性集U上的关系模式,X、Y是U的子集。如果Y函数依赖于X,且对于X的任何一个真子集X’,都有Y不函数依赖于X’,则称Y对X完全函数依赖。记作:如果Y函数依赖于X,但Y不完全函数依赖于X,则称Y对X部分函数依赖。
主属性:
所有的候选键包含的属性集合是主属性集合
相应的非主属性是所有候选码都不包含的属性
1NF:所有关系模式都满足1NF,1NF要求是表中无表。
2NF:
若某关系R属于第一范式,且每一个非主属性完全函数依赖于任何一个候选码,则关系R属于第二范式。
判断一个关系是否属于第二范式:
找出数据表中的所有码;
找出所有主属性和非主属性;
判断所有的非主属性对码的部分函数依赖。
3NF: 非主属性既不传递依赖于码,也不部分依赖于码。
BCNF:消除了主属性对候选码的部分和传递函数依赖。
3NF分解
3NF分解一般分为两种:保持依赖和无损连接。
为了说明求解保持依赖,我们先要会求最小依赖集。
(1)最小依赖集求法:
口诀:
右侧先拆单,依赖依次删。
还原即可删,再拆左非单。
通过求下面的最小依赖集对口诀进行解释,
如果想深入了解如何求最小依赖集,请参考:最小依赖集求法
(2)3NF分解:
口诀:
保函依赖分解题,先求最小依赖集。
依赖两侧未出现,分成子集放一边,剩余依赖变子集。
若要连接成无损,再添候选做子集。
例题
例1.已知R(ABCDE), F={A ->D,E->D,D->B,BC->D,DC->A}求保持函数依赖的3NF分解,和具有无损连接性及保持函数依赖的3NF分解
第一步:保函依赖分解题,先求最小依赖集。
先求出R的最小依赖集,可得F={A ->D,E->D,D->B,BC->D,DC->A}
第二步:依赖两侧未出现,分成子集放一边。
首先可以发现没有不出现在两侧的元素不用单独分出一个子集,“剩余依赖变子集”然后我们将各依赖分别划分为子集得到:{AD} {ED} {DB} {BCD} {DCA},即为所求保持函数依赖的3NF分解
第三步:若要连接成无损,再添候选做子集。
(1)候选码的求解:所谓候选码即能决定整个关系的,我们通过找未出现在依赖右边的和两侧均未出现的元素即可求得,
(2)可以发现C E未出现在右边,因此候选码为{CE}。故所求具有无损连接性及保持函数依赖的3NF分解为{AD} {ED} {DB} {BCD} {DCA} {CE}。
**例2.**关系模式R,有U={A,B,C,D,E,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D},将关系模式分解为3NF且保持函数依赖
将关系模式分解为3NF且保持函数依赖:
**第一步:保函依赖分解题,先求最小依赖集。**先求出R的最小依赖集,
假设B->G冗余,则(B)+=BD,没有G故不冗余。
假设CE->B冗余,则(CE)+=CEGDA,没有B故不冗余。
假设C->A冗余,则©+=CD,故不冗余。
一次可以得到最小函数依赖集Fm={B->G,CE->B,C->A,B->D,C->D}
第二步:依赖两侧未出现,分成子集放一边,剩余依赖变子集。
首先可以发现没有不出现在两侧的元素,然后我们将各依赖分别划分为子集得{BG} {CEB} {CA} {BD} {CD},即为所求保持函数依赖的3NF分解
第三步:若要连接成无损,再添候选做子集。
找到R的一个候选码为{ACE}。故所求具有无损连接性及保持函数依赖的3NF分解为{BG} {CEB} {CA} {BD} {CD} {CE} (注:范式分解并不唯一,正确即可)
BCNF分解:
将关系模式R分解为一个BCNF的基本步骤是
1)先求最小依赖集,候码非码成子集
2)余下左侧全候码,完成BCNF题。
例.关系模式R,有U={A,B,C,D,E,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D},将关系模式分解为3NF且保持函数依赖
将关系模式分解为3NF且保持函数依赖:
第一步:先求最小依赖集。
可以发现CE->G多余,因此最小依赖集为F={B->G,CE->B,C->A,B->D,C->D}。
第二步:候码非码成子集。
由于候选码为(CE)因此将CE->B划分出子集(BCE),而B->G,B->D左侧均不含主属性(C、E)中的任何一个故划分出(BG),(BD)
第三步:
此时剩余依赖F={C->A,C->D}剩余元素{A,C,D}检查发现函数依赖左侧都是候选码即完成BCNF分解,如果不满足则继续分解余下的。
于是BCNF分解的最后结果为{(BG),(BD),(ACD),(BCE)}。
注意:关系为1:n时,需要将相关属性给n的那一边,
关系为m:n时,需要独立一个关系模式出来。