赞
踩
信息(Information)
是数据经过加工处理后得到的另一种形式的数据,这种数据在某种程度上影响接收者的行为。具有客观真实性、传递性、时效性和有用性
数据(Data)
描述事物的符号记录称为数据。数据的种类由数字、文字、图形、图像、声音、正文等。数据与语义是不可分的
信息是加工过的数据,是数据的内涵, 数据是现象,信息反映 实质
数据库(DataBase,DB)
长期存储在 计算机内、有组织的、可共享 的 大量 的数据集合
数据库管理系统(DataBase Management System,DBMS)
是位于用户与操作系统之间的一层数据管理软件。和操作系统一样是计算机的基础软件,也是一个大型复杂的软件系统
人工管理阶段
特点:
文件管理阶段
优点:
缺点:
数据库管理系统阶段
特点;
数据模型
概念模型
基本术语
实体(Entity): 客观存在并可相互区分的事物
实体集(Entity Set): 同类型实体的集合。每个实体集必须命名
属性(Attribute): 实体所具有的特征和性质
属性值(Attribute Value): 为实体的属性取值
域(Domain): 属性值的取值范围
码(Key): 唯一标识实体集中一个实体的属性或属性集
实体型(Entity Type): 表示实体信息结构,由实体名及其属性名集合表示
eg:实体名(属性1,属性2,…) 学生(学号,姓名,性别,年龄)
层次模型
层次模型是数据库系统中最早出现的数据模型
层次数据库系统的典型代表是IBM公司的IMS(Information Management System)数据库管理系统
层次模型用树形结构来表示各类实体以及实体间的联系。
特点:
层次模型的数据操纵:
层次模型的完整性约束条件:
优点:
缺点:
网状模型
网状数据库系统采用网状模型作为数据的组织方式。
典型代表是DBTG系统(亦称CODASYL系统,20世纪70年代由DBTG提出的一个系统方案)
满足下面两个条件的基本层次联系的集合:
优点:
缺点:
关系模型
关系模型的术语:
关系模型的数据结构:
关系模型的数据操作与完整性约束:
关系模型的优缺点:
数据库系统的三级模式结构:
模式:
也称逻辑模式,数据库中全体数据的逻辑结构和特征的描述,所有用户的公共数据视图
一个数据库只有一个模式
模式的地位:是数据库系统模式结构的中间层
定义模式
外模式(External Schema)
也称子模式或用户模式,数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻 辑结构和特征的描述,数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
外模式的地位:介于模式与应用之间
模式与外模式的关系:一对多
内模式(internal Schema)
也称存储模式,是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。
一个数据库只有一个内模式
关系数据库对三级模式结构的支持:
外模式/模式映象
模式/内模式映像
域:是一组具有相同数据类型的值的集合
笛卡儿积:给定一组域 D 1 、 D 2 、 … 、 D n D1、D2、…、Dn D1、D2、…、Dn (这些域中可以有相同的)
D 1 × D 2 × . . . × D n = { ( d 1 , d 2 , . . . , d n ) ∣ d i ∈ D i , i = 1 , 2 , . . . , n } D_1\times D_2\times ... \times D_n=\{(d_1,d_2,...,d_n)|d_i \in D_i,i=1,2,...,n\} D1×D2×...×Dn={(d1,d2,...,dn)∣di∈Di,i=1,2,...,n}
其中每一个元素 ( d 1 , d 2 , … , d n ) (d1,d2,…,dn) (d1,d2,…,dn)叫作一个n元组或简称元组,元素中的每一个值di叫作一个分量
关系:
D
1
×
D
2
×
…
×
D
n
D_1×D_2×…×D_n
D1×D2×…×Dn 的子集叫做在域
D
1
,
D
2
,
…
,
D
n
D_1,D_2,…,D_n
D1,D2,…,Dn上的关系(Relation) ,表示为:
R
(
D
1
,
D
2
…
,
D
n
)
R(D1, D2 …, Dn)
R(D1,D2…,Dn)
R是关系名,n为关系的目。
基本关系具有的性质
关系域二维表的对应:
关系模式:
R ( U , D , d o m , F ) R(U,D,dom,F) R(U,D,dom,F)
其中R为关系名,U为组成该关系的属性名集合,D为属性组U中属性所来自的域,dom为属 性向域的映象集合,F为属性间数据的依赖关系集合
关系模式与关系
关系的基本操作
查询
选择、投影、连接、除、并、交、差、笛卡尔积等
数据更新
插入、删除、修改
查询的表达能力是其中最主要的部分
关系操作的特点
关系数据语言的种类
**关系代数:**一种抽象的 查询语言,用对关系的 运算 来表达查询
关系代数运算的三要素:运算对象:关系运算,结果:关系,运算符:四类
关系运算符
关系代数运算的分类
传统的集合运算
并、差、交、广义笛卡尔积
专门的关系运算
选择、投影、连接、除
并、交、差
R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R∪S = \{t | t \in R\ ∨\ t \in S \} R∪S={t∣t∈R ∨ t∈S}
R − S = { t ∣ t ∈ R ∨ t ∉ S } R-S = \{t | t \in R\ ∨\ t \notin S \} R−S={t∣t∈R ∨ t∈/S}
KaTeX parse error: Undefined control sequence: \and at position 23: …\{t | t \in R\ \̲a̲n̲d̲\ t \in S \}\\ …
广义笛卡尔积
R × S = { t r t s ⌢ ∣ t r ∈ R ∧ t s ∈ S } R×S = \{\stackrel\frown{t_rt_s} | t_r \in R ∧ t_s \in S \} R×S={trts⌢∣tr∈R∧ts∈S}
选择
σ
条件
(
表名
)
\sigma_{条件}(表名)
σ条件(表名)
投影
∏
属性列名
(
表名
)
=
{
t
[
A
]
∣
t
∈
R
}
{\textstyle \prod_{属性列名}^{}}(表名)=\{ t[A]|t\in R\}
∏属性列名(表名)={t[A]∣t∈R}
θ连接:从两个关系的笛卡尔积中选取属性间满足一定条件的元组
KaTeX parse error: Undefined control sequence: \and at position 70: …t_s}|t_r\in R\ \̲a̲n̲d̲\ t_s \in t_r[A…
**等值连接:**θ为“=”的连接运算称为等值连接
自然连接(Natural join) :
R
⋈
S
R\bowtie S
R⋈S
连接名词解释
SQL(Structured Query Language),1974年提出
SQL特点
基本表的定义:
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[<列级完整性约束条件>] ] …
[,<表级完整性约束条件> ] );
其中:
完整性约束:
实体完整性约束:primary key
//列级完整性约束条件
<列名> <数据类型> primary key,
//表级完整性约束条件(若住吗有两个或两个以上属性列必须使用此方法)
primary key(列名1,列名2,...)
参照完整性约束:foreign key
//表级约束
foreign key (列名) references <被参照表表名>(列名)
用户自定义的完整性约束:
修改基本表
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ] //加入数据列
[ ADD <表级完整性约束> ] //添加表记约束性条件按
[ DROP COLUMN <列名> ] //删除列
[ DROP CONSTRAINT <完整性约束名> ] //删除完整性约束名(注意是约束的名)
[ MODIFY <列名> <数据类型> ]; //修改列的数据类型
删除基本表
DROP TABLE <表名>;
索引的概念
索引的建立
创建索引的方法分为 间接创建 与 直接创建
间接创建: 在表中创建其他对象是附加创建了索引 eg: 主键约束 或 唯一性约束
直接创建: 使用 create index 方法
CREATE [UNIQUE|BITMAP] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
删除索引
DROP INDEX <索引名>;
单表查询
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
查询全部列 **使用 * **
消除取值重复的行(在目标表达式之前添加 distinc)
查询满足条件的值(where子句中)
字符串匹配:[not] like <匹配串>
*
代表一串字符,_
代表一个字符
涉及空值查询只能使用 is null
或is not all
使用 and、or 连接多个条件
对查询结果排序
使用 order by 子句 。升序ASC(省缺,空值最后展示) 和 降序DESC(空值最先展示)
使用集函数
COUNT([DISTINCT|ALL] *) //统计个数
COUNT([DISTINCT|ALL] <列名>)
SUM([DISTINCT|ALL] <列名>) //求和
AVG([DISTINCT|ALL] <列名>) //求平均
MAX([DISTINCT|ALL] <列名>) //求最大
MIN([DISTINCT|ALL] <列名>) //求最小
对查询结果分组
使用GROUP BY子句将查询结果表按某一列或多列值分组,值相等的为一组
未对查询结果分组,集函数将作用于整个查询结果
对查询结果分组后,集函数将分别作用于每个组
GROUP BY子句的作用对象是查询的中间结果表
使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数
只有满足HAVING短语指定条件的组才输出
HAVING短语与WHERE子句的区别:作用对象不同
连接查询
若一个查询同时涉及两个以上的表,则称之为连接查询
连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词
一般格式
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
比较运算符:=、>、<、>=、<=、!=
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
等值连接(运算符为’=‘)
自身连接
一个表与其自己进行连接,称为表的自身连接
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用表别名前缀
SELECT a.sno
FROM sc a,sc b
WHERE a.sno=b.sno
外连接(Outer Join)
如果把两个关系R、S在做自然连接时舍弃的悬浮元组保存在结果关系中,在其它属性上填空值,那么这种连接就叫做全外连(full outer join)
如果只把左边关系R中要舍弃的悬浮元组保留就叫做左外连(left outer join)
如果只把右边关系S中要舍弃的悬浮元组保留就叫做右外连(right outer join)
from <左表名> <full|left|right outer join> <右表名>(条件)
嵌套查询
一个SELECT-FROM-WHERE
语句称为一个查询块
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
eg:
SQL语言允许多层嵌套查询
不能使用ORDER BY子句
层层嵌套方式反映了 SQL语言的结构化
有些嵌套查询可以用连接查询替代
嵌套查询的分类
引出子查询的谓词
集合查询
插入数据
插入单个元组
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…])]
VALUES (<常量1> [,<常量2> … ])
如果不指定属性列,则必须插入所有元素,无属性值的为NULL
插入子查询结果
insert
into <表名> [(<属性列1>[,<属性列2 >…])]
select 查询语句
commit;
修改数据
update <表名>
set 属性列 = 某个值
where 条件
commit;
删除数据
DELETE
FROM <表名>
[WHERE <条件>];
不指定条件则删除表中所有元素
视图的概念
视图的定义
CREATE [OR REPLACE] VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
视图的查询
视图的更新
视图的删除
DROP VIEW <视图名>;
视图的作用
视图能够简化用户的操作
视图使用户能以多种角度看待同一数据
视图对重构数据库提供了一定程度的逻辑独立性
视图能够对机密数据提供安全保护
适当的利用视图可以更清晰的表达查询
数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄漏、更改或破坏
对数据库安全性产生威胁的因素
用户身份鉴别是数据库管理系统提供的最外层安全保护措施
基本方法
鉴别方法
数据库安全最重要的一点就是确保只授权给有资格的用户访问数据库的权限,同时令所有未被授权的人员无法接近数据,这主要通过数据库系统的存取控制机制实现
存储控制机制包括两部分
常用存取控制方法
Oracle安全性控制
用户管理
create user 用户名
identified {by 口令 | externally} //身份验证方式
[default tablespace 默认表空间名]
[temporary tablespace 临时表空间名]
[quota {整数[K | M]| unlimited} on 表空间名] //设置存储配额
[quota {整数[K | M]| unlimited} on 表空间名]
[password expire]
[account {lock | unlock}] //设置用户是否被锁定,锁定为无法登录
[profile {概要文件名 | default}]
创建的新用户没有任何权限,甚至连登录数据库的权限都没有,需要为其指定相应的权限
eg:
create user u1 identified by 123456
default tablespace users
temporary tablespace temp
quota unlimited on users
alter user 用户名
identified {by 口令 | externally}
[default tablespace 默认表空间名]
[temporary tablespace 临时表空间名]
[quota {整数[K | M]| unlimited} on 表空间名]
[quota {整数[K | M]| unlimited} on 表空间名]
[password expire]
[account {lock | unlock}]
[profile {概要文件名 | default}]
drop user
权限drop user 用户名 [cascade]
如果指定cascade,将会删除这个用户所拥有的所有对象
模式
权限管理
一个新的用户被创建后,该用户还无法操作数据库,还需要为用户授予相关的权限
权限是指在数据库中执行某种操作的权利
Oracle有两种类型的权限:系统权限和对象权限
系统权限:允许用户在数据库的任何模式上执行特定操作所需要的权限称为系统权限,这些操作包括建立、修改和删除表、视图、索引、表空间、触发器、用户、角色等
grant {系统权限|角色}[,{系统权限|角色}]…
to {用户|角色|public}[,{用户|角色|public}] …
[with admin option] //允许将自己的权限赋予其他用户或角色
回收系统权限:使用REVOKE语句可以从用户或角色中回收系统权限。语句格式:
revoke { 系统权限 | 角色 } [, { 系统权限 | 角色 } ]…
from { 用户 | 角色 | public} [, { 用户 | 角色 | public}] …
部分常用系统权限
系统权限 | 说明 | 系统权限 | 说明 |
---|---|---|---|
Create session | 连接数据库 | Update any table | 修改任何用户模式中的表的记录 |
Create tablespace | 创建表空间 | Delete any table | 删除任何用户模式中的表的记录 |
Alter tablespace | 修改表空间 | Create view | 创建视图 |
Drop tablespace | 删除表空间 | Create any view | 在任何用户模式中创建视图 |
Create user | 创建用户 | Drop any view | 删除任何用户模式中的视图 |
Alter user | 修改用户 | Create role | 创建角色 |
Drop user | 删除用户 | Alter any role | 修改任何角色 |
Create table | 创建表 | Grant any role | 将任何角色授予其它用户 |
Create any table | 在任何用户模式中创建表 | Alter datebase | 修改数据库结构 |
Drop any table | 删除任何用户模式中的表 | Create procedure | 创建存储过程 |
Alter any table | 修改任何用户模式中的表 | Create any procedure | 在任何用户模式中创建存储过程 |
Select any table | 查询任何用户模式中基本表的记录 | Alter any procedure | 修改任何用户模式中的存储过程 |
Insert any table | 向任何用户模式中的表插入记录 | Drop any procedure | 删除任何用户模式中的存储过程 |
对象权限:允许用户访问一个特定对象并对特定对象执行特定操作所需要的权限称为对象权限
对象权限针对不同模式的对象,如表、视图、序列、过程、函数等
对象权限可以是对数据的查询(select)、修改(update)、删除(delete) 、插入(insert)或引用(references) ,也可以是是否可以**执行(execute)**程序的权限,或修改对象结构(alter)的权限
授予对象权限:使用grant语句授予对象权限,语句格式:
grant {对象权限[,对象权限]…| all[privileges]}
on [模式.] 对象名
to { 用户|角色|public}[,{用户|角色|public}] …
[with grant option]
revoke {对象权限[,对象权限 ]…|all[privileges]}
on [模式.] 对象名
from { 用户|角色|public}[,{用户|角色|public}] …
[cascade constraints] //级联回收
角色管理
角色将用户权限归为一组,对权限进行组管理
角色是一组权限的集合
如果将一个角色授予一个用户,意味着这个用户拥有这个角色内的所有权限
数据库建立时,Oracle会自动创建一些角色,称为预定义角色
创建角色语句格式:
create role 角色名
[not identified | identified { by 口令 | externally | globally}]
修改角色语句格式:
alter role 角色名
not identified | identified { by 口令 | externally | globally}]
删除角色语句格式:
drop role 角色名
授予角色权限与回收角色权限与对象操作相同
好像没学过吧
强制存取控制
**强制存取控制(MAC)**是指系统为保证更高程度的安全性,按照TDI/TCSEC标准中安全策略的要求,所采取的强制存取检查手段
MAC适用于对数据有严格而固定密级分类的部门
在MAC中,DBMS所管理的全部实体被分为主体和客体两大类
对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label)
强制存取控制规则:当某一用户(或某一主体)以标记label注册进入系统后,系统要求他对任何客体的存取必须遵循下面两条规则:
强制存取控制的特点
视图机制
审计
数据加密
数据库的完整性是指数据的正确性和有效性。是指数据是符合现实世界语义、反映当前实际状况的
通过对关系(二维表)中取值的约束,可以保证数据库的完整性,保证数据的正确性
关系模型中有三类完整性约束:
数据的完整性和安全性是两个不同的概念
实体完整性规则:若属性A是基本关系R的主属性,则属性A不能取空值,不能有相同值
eg:
实体完整性的实现
在create table语句中用primary key定义哪些列为主码(主键)
实体完整性的检查和违约处理
参照完整性规则
参照完整性实现
参照完整性检查和违约处理
用户定义的完整性规则
用户定义的完整性实现
用户定义的完整性检查和违约处理
元组上的约束条件的定义
元组上的约束条件检查和违约处理
关系模式问题:
原因
关系模式中的函数依赖存在某些“不好”的性质
如何改造?
规范化理论:通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常和数据冗余等问题
函数依赖的定义:
$$
设 R(U) 是一个属性集 U 上的关系模式,X和 Y 是 U 的子集\
若对于 R(U) 的任意一个可能的关系 r ,r 中不可能存在两个元组在 X 上的属性值相等\
而在 Y 上的属性值不等, 则称\ X函数确定Y\ 或 \ Y函数依赖于X\ ,记\ X→Y
$$
平凡函数依赖与非平凡函数依赖
在关系模式
R
(
U
)
中,对于
U
的子集
X
和
Y
如果
X
→
Y
,但
Y
⊈
X
,则称
X
→
Y
是非平凡的函数依赖
若
X
→
Y
,但
Y
⊆
X
,
则称
X
→
Y
是平凡的函数依赖
在关系模式 R(U) 中,对于 U 的子集 X 和 Y \\ 如果 X→Y,但 Y \nsubseteq X,则称 X→Y 是非平凡的函数依赖\\ 若 X→Y,但 Y \subseteq X, 则称X→Y 是平凡的函数依赖
在关系模式R(U)中,对于U的子集X和Y如果X→Y,但Y⊈X,则称X→Y是非平凡的函数依赖若X→Y,但Y⊆X,则称X→Y是平凡的函数依赖
eg:
完全函数依赖与部分函数依赖
在关系模式
R
(
U
)
中
,
如果
X
→
Y
,
并且对于
X
的任何一个真子集
X
′
,都有:
X
′
↛
Y
,
则称
Y
完全函数依赖于
X
,
记作
X
⟶
f
Y
若
X
⟶
Y
,
但
Y
不完全函数依赖于
X
,
则称
Y
部分函数依赖于
X
,
记作
X
⟶
P
Y
在关系模式R(U)中, 如果X \rightarrow Y , 并且对于 X 的任何一个真子集X^{\prime}, 都有:\\ X^{\prime} \nrightarrow Y , 则称 Y 完全函数依赖于 X , 记作 X \stackrel{f}{\longrightarrow} Y \\ 若 X \longrightarrow Y , 但 Y 不完全函数依赖于 X , 则称 Y 部分函数 依赖于 X , 记作 X \stackrel{P}{\longrightarrow} Y
在关系模式R(U)中,如果X→Y,并且对于X的任何一个真子集X′,都有:X′↛Y,则称Y完全函数依赖于X,记作X⟶fY若X⟶Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X,记作X⟶PY
eg:
传递函数依赖
在关系模式
R
(
U
)
中
,
如果
X
↛
Y
(
Y
⊈
X
)
,
Y
↛
X
,
Y
→
Z
(
Z
⊈
Y
)
则称
Z
传递函数依赖于
X
,记为
X
⟶
传递
Z
注
:
如果
Y
→
X
,
即
X
←
→
Y
,则称
Z
直接依赖于
X
在关系模式 R(U)中,如果X \nrightarrow Y\ (Y\nsubseteq X),Y \nrightarrow X,Y \rightarrow Z(Z\nsubseteq Y)\\ 则称Z传递函数依赖于X,记为 \quad X \overset{传递}{\longrightarrow}Z \\ 注:如果 Y \rightarrow X,即X \leftarrow \rightarrow Y,则称Z直接依赖于X
在关系模式R(U)中,如果X↛Y (Y⊈X),Y↛X,Y→Z(Z⊈Y)则称Z传递函数依赖于X,记为X⟶传递Z注:如果Y→X,即X←→Y,则称Z直接依赖于X
构造数据库必须遵循一定的规则,在关系数据库中,这种规则就是范式
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化
1NF的要求:如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF
eg: Student(Sno, Sdept, Mname, Cno, Grade)
2NF的要求:若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF
eg:
3NF的要求:若关系模式R∈1NF,并且每一个非主属性不传递函数依赖于R的码,则R∈3NF
在满足第三范式的关系模式中,前面提到的一些问题(如数据冗余、插入异常、删除异常等)基本消失了
eg: 因为SL表中 S N O → S D E P T SNO\rightarrow SDEPT SNO→SDEPT 而 S D E P T → M N A M E SDEPT \rightarrow MNAME SDEPT→MNAME 所以 S N O ⟶ 传递 M N A M E SNO\overset{传递}{\longrightarrow}MNAME SNO⟶传递MNAME
规范化的基本思想
关系模式规范化的基本步骤
关系模式的分解准则
模式分解要满足:
模式分解具有无损连接性
无损连接是指分解后的关系通过自然连接可以恢复成原来的关系,即通过自然连接得到的关系与原来的关系相比,既不多出信息、又不丢失信息
模式分解能够保持函数依赖
保持函数依赖分解是指在模式的分解过程中,函数依赖不能丢失的特性,即模式分解不能破坏原来的语义
把使用数据库的各类信息系统统称为数据库应用系统
什么是数据库设计?
数据库设计的特点
数据库设计的六步骤
需求分析就是分析用户的需要与要求
需求分析的任务
通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统(手工系统或计算机系统)工作概况,明确用户的各种需求
在此基础上确定新系统的功能。新系统必须充分考虑今后可能的扩充和改变,不能仅仅按当前应用需求来设计数据库
需求分析的重点
需求分析的难点
需求分析的方法 : SA方法 从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并用数据流程图和数据字典描述系统
eg:
数据字典
数据流程图同数据字典的区别和联系
什么是概念结构设计?
概念模型的表示方法:实体-联系方法(Entity-Relationship)
E-R图
概念结构设计
E-R图的合并
逻辑结构设计的任务
E-R图向关系模型的转化
转换内容
转换原则
数据模型的优化
设计用户子模式
关系数据库物理设计的内容和方法
为关系模式选择存取方法(建立存取路径)
确定数据库的存储结构
确定数据的存放位置和存储结构
确定系统配置
数据库实施的工作内容
数据库的维护
PL/SQL也是一种程序语言,叫过程化SQL语言(Procedural Language/SQL)
PL/SQL程序
PL/SQL程序的组成 3部分
程序结构
DECLARE
/* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 ,可选*/
BEGIN
/*执行部分: 过程及SQL语句,即程序的主要部分,必须*/
EXCEPTION
/* 执行异常部分: 错误处理,可选*/
END;
变量及数据类型
变量的声明
declare
变量名 数据类型;
变量名 表名.列名%type; //变量与类所对应的数据类型相同
变量名 表名%powtype; //数据类型与表的数据结构相同
变量赋值
变量名 := 常量或表达式 //在声明与执行阶段均可执行
运算符与表达式
一般运算符
关系运算符
逻辑运算符
pl/sql流程控制语句
PL/SQL的流程控制语句, 包括如下三类:、
顺序语句:
条件语句:
循环语句:
LOOP…END LOOP语句
WHILE语句
FOR循环语句
常用方法:dbms_output.put_line('字符串' || 变量)
游标的概念
游标的使用步骤
声明游标
declare
cursor 游标名称 is
select查询语句;
打开游标
open 游标名称;
提取游标元素
loop
fetch 游标名称 into 变量1, 变量2, ...;
exit when 游标名称%notfound;
end loop;
关闭游标
close 游标名称
游标的属性
存储过程的概念
创建存储过程
语法格式:
CREATE [OR REPLACE] PROCEDURE <过程名>
[(<参数名><参数类型><数据类型>[DEFAULT <默认值>][,…n])]
{ IS | AS }
[<变量声明> ]
BEGIN
<过程体>
END[过程名];
存储过程的调用
begin
<过程名>[([<参数名>=>]<实参>[,…n])];
end;
删除存储过程
DROP PROCEDURE 存储过程名
触发器是一种特殊的存储过程,当某个ORACLE事件发生时系统自动地运行,所以运行触发器就叫触发,触发器不能接收参数
触发器由三个部分组成:事件、条件、动作。
事件:或称为触发事件,当某个事件发生的时候就运行触发器
条件:判断是否达到指定的条件,如果没有达到条件将不执行
动作:条件通过后所要做的事情
动作,可以留空,表示直接执行动作
创建触发器
CREATE OR REPLACE TRIGGER trigger_name
{BEFORE | AFTER} <触发事件> ON <表名>
[FOR EACH ROW]
[WHEN <触发条件>]
<触发动作体>
before|after
触发时序
<触发事件>
:insert,delete,update
for each row
:行触发
当触发器被激活时,在触发体中要使用激活触发器的语句中操作的数据,需要用到以下两个修饰符
删除触发器
DROP TRIGGER trigger_name;
什么是事物?
事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
事务和程序是两个概念
事务是恢复和并发控制的基本单位
显式定义方式
隐式定义的方式
事务的ACID特性:
原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做
一致性(Consistency)
事务执行的结果必须是使数据库从一个一致状态变到另一个一致状态
隔离性(Isolation)
对并发执行而言,一个事务的执行不能被其他事务干扰
持续性(Durability )
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
故障的种类
事物内部的故障
某个事务在运行过程中由于种种原因未运行至正常终止点就夭折了
系统故障
造成系统停止运转的任何事件,使得系统要重新启动
介质故障
介质故障又称为硬故障,这类故障使存储在外存中的数据部分丢失或全部丢失
计算机病毒
一种人为的故障或破坏,是一些恶作剧者研制的一种计算机程序
对数据库的影响
恢复操作的基本原理:冗余
恢复机制涉及的关键问题
转储是指DBA通过DBMS的恢复子系统,将整个数据库复制到磁带或另一个磁盘上保存起来的过程,这些备用的数据称为后备副本或后援副本
静态转储与动态转储
海量转储与增量转储
日志文件:是用来记录事务对数据库的更新操作的文件
每个事务开始的标记、每个事务的结束标记和每个更新操作均作为日志文件中的一个日志记录 (log record)
日志的内容
日志文件的用途
**事务故障:**事务在运行至正常终止点前被中止。
**系统故障:**造成系统停止运转的任何事件,使得系统要重新启动
**介质故障:**介质故障又称为硬故障,这类故障使存储在外存中的数据部分丢失或全部丢失
并发操作不正确的调度方式带来的数据不一致性现象:
并发控制概述
封锁:
就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象
基本封锁类型
排它锁(Exclusive Locks,简记为X锁)
若事务T对数据对象A加上排它锁,则只允许T读取和修改A。其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁
共享锁(Share Locks,简记为S锁)
若事务T对数据对象A加上共享锁,则事务T可以读A但不能修改A。其它事务只能再对A加共享锁,而不能加排它锁,直到T释放A上的共享锁
锁的相容矩阵
封锁协议
运用封锁方法时,对数据对象加锁时需要约定一些规则:
三种封锁协议:
封锁技术可以有效地解决并发操作的一致性问题,但也带来一些新的问题:
活锁
假设T1对A加锁,T2等待,等到T1解锁后T3又对A加锁,导致T2一直等待
避免活锁:采用先来先服务的策略
死锁
产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已被其他事务封锁的数据对象加锁,从而出现死等待
预防死锁的发生就是要破坏产生死锁的条件
一次封锁法
要求每个事务在执行之前必须一次将所有要使用的数据全部加锁,否则就不能继续执行
顺序封锁法
顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁
死锁的诊断与解除
死锁的诊断
超时法
系统设置一个时间段,每隔规定的时间对系统中的事务进行检查,如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
事务等待图法
用事务等待图动态反映所有事务的等待情况
解除死锁
可串行化调度
多个事务并发执行,当且仅当其执行结果与按某一次序串行地执行这些事务时的结果相同,多个事务的并发执行是正确的,称这种调度策略为可串行化的调度
可串行性
冲突操作
冲突操作是指不同的事务对同一个数据的读写操作和写写操作
可串行化调度的充分条件
目前DBMS普遍采用**两段锁协议(Two-Phase-Locking,简称2PL)**的方法实现并发调度的可串行性,从而保证调度的正确性
两段锁协议
指所有事务必须分两个阶段对数据项加锁和解锁
在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
在释放一个封锁之后,事务不再申请和获得任何其他封锁
“两段”锁的含义
事务分为两个阶段:
事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。