有些东西就直接略过了,有的打算另开篇幅来分析。
● 数据模型
第一类是概念模型。第二类是逻辑模型和物理模型。
数据模型通常由数据结构、数据操作和完整性约束组成。
概念模型:
1.实体:客观存在并可相互区别的事物称为实体。
2.属性:实体所具有的某一特征称为属性。
3.码:唯一标识实体的属性集称为码。
4.域:域是一组具有相同数据类型的值的集合。
5.实体型:用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。
6.实体集:同一类型实体的集合称为实体集。
7.联系:实体(型)内部的联系和实体(型)之间的联系。
E-R图表示实体型、属性和联系的方法:
实体型:用矩形表示,矩形框内写明实体名。
属性:用椭圆形表示,并用无向边将其与相应的实体型连接起来。
联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型(1:1,1:n或m:n)。
● 关系数据库
笛卡尔积:是域上面的一种集合运算。
给定一组域D1,D2,…,Dn,这些域中可以是相同的域。D1,D2,…,Dn的笛卡尔积为D1×D2×…Dn = {(d1,d2,…,dn)|di∈Di,i=1,2,…n}
其中每一个元素(d1,d2,…,dn)叫做一个n元组或简称元组。
元素中的每一个值di叫做一个分量。
若关系中的某一属性组的值能唯一地标志一个元组,则称该属性组为候选码。
若一个关系有多个候选码,则选定其中一个为主码。
候选码的诸属性称为主属性。不包含在任何候选码中的属性称为非主属性和非码属性。
在最简单的情况下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性是这个关系模式的候选码,称为全码。
● 关系代数
1.选择:选择又称为限制。它是在关系R中选择满足给定条件的诸元组。
2.投影:关系R上的投影是从R中选择若干属性列组成新的关系。
3.连接:它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。
聚合函数:count(对元组计数) total(求总和) max min avg
● 数据定义
1.定义模式
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
2.删除模式
DROP SCHEMA <模式名> <CASCADE | RESTRICT>
其中CASCADE | RESTRICT两者必选其一。
选择了CASCADE(级联),表示在删除模式的同时把该模式中所有的数据库对象全部一起删除。
选择了RESTRICT(限制),表示如果该模式中已经定义了下属的数据库对象(表、视图等),则拒绝该删除语句的执行。
3.定义表
create table “S-T”.SC (Sno CHAR(9), Cno CHAR(4),Grade SMALLINT,
primary key (Sno,Cno),
foreign key (Sno) reference Student (Sno)),
foreign key (Cno) reference Cource(Cno)
);
4.修改基本表
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ]]
[ DROP <完整性约束名>]
[ ALTER COLUMN <列名> <数据类型>];
5.删除表
DROP TABLE <表名> [RESTRICT | CASCADE];
若选择RESTRICT,则表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束),不能有视图,不能有触发器,不能有存储过程或函数等。
若选择CASCADE,则表的函数没有限制条件。
6.建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名> (<列名> [<次序>] [,<列名>] [<次序>]]…);
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER表示要建立的索引是聚簇索引。指索引的顺序与表中记录的物理顺序一致的索引组织,因此对于经常更新的列不宜建立聚簇索引。
create unique index Cno on SC (Sno ASC, Cno DESC);
7.删除索引
DROP INDEX <索引名>;
在RDBMS中索引一般采用B+树,HASH索引来实现。
● 数据查询
SELECT [ALL | DISTINCT] <目标列表达式> [, <目标列表达式>]…
FROM <表名或视图名> [, <表名或视图名>]…
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC | DESC]]
字符匹配:
%代表任意长度(可以为0)的字符串。
_代表任意单个字符。
如果查询的字符串本身含有这些符号,则使用 \ 进行转义。
select Sno from SC where Grade IS NULL; //IS不能用=代替。
外连接:
select student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade From Student LEFT OUT JOIN SC ON (Student.Sno = SC.Sno);
From Student LEFT OUT JOIN SC USING (Sno); //用USING去掉结果中的重复值。
左外连接列出左边关系中所有的元组,右外连接列出右边关系中所有的元组。
带有ANY SOME或ALL谓词的子查询
> ANY 大于子查询结果中的某个值 某个
> ALL 大于子查询结果中的所有值 所有
用聚集函数实现子查询要比直接用ANY或ALL查询效率要高。
带有EXISTS/NOT EXISTS谓词的子查询
select Sname from Student where exists (select * from sc where Sno = Student.Sno AND Cno = ‘1’);
集合查询
集合操作主要包括并操作UNION、交操作 INTERSECT 和差操作 EXCEPT
update Student set Sage = Sage + 1;
● 视图
1.建立视图
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
create view只是把视图的定义存入数据字典,并不执行其中的select语句。
2.删除视图
DROP VIEW <视图名> [CASCADE];
3.更新视图
通过视图来插入,删除,修改数据。
由于视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新。
● 数据库安全
授权与回收:
1.GRANT
GRANT <权限> [,<权限>]…
ON <对象类型> <对象名> [,<对象类型> <对象名>]…
TO <用户> [,<用户>]…
[WITH GRANT OPTION];
将对指定操作对象的指定操作权限授予指定的用户。
2.REVOKE
REVOKE<权限> [,<权限>]…
ON <对象类型> <对象名> [,<对象类型> <对象名>]…
FROM <用户> [,<用户>]…[CASCADE | RESTRICT];
● 数据库完整性
检查记录中主码值是否唯一的一种方法是进行全表扫描,全表扫描是十分耗时的,为了避免对基本表进行全表扫描,RDBMS核心一般都在主码上自动建立一个索引,如B+树索引。
check (sex = ‘女’ OR Sname NOT LIKE ‘Ms.%’)
定义触发器
create trigger insert_or_update_sql
Before insert or update on teacher
for each row
as begin
if(new.job=’教授’) and (new.sal < 4000) then
new.sal := 4000;
end if;
end;
删除触发器
DROP TRIGGER <触发器名> ON <表名>;
● 关系数据理论
X → Y, 但Y∉X则称X → Y是非平凡的函数依赖。
X → Y, 但Y∈X则称X → Y是平凡的函数依赖。
在R(U)中,如果X → Y,并且对于X的任何一个真子集X’,都有X’→ Y不成立,则称Y对X完全函数依赖。
若X → Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖。
规范化过程:
● 数据库设计
1、需求分析:了解用户的数据需求、处理需求、安全性及完整性要求;
2、概念设计:通过数据抽象,设计系统概念模型,一般为E-R模型;
3、逻辑结构设计:设计系统的模式和外模式,对于关系模型主要是基本表和视图;
4、物理结构设计:设计数据的存储结构和存取方法,如索引的设计;
5、系统实施:组织数据入库、编制应用程序、试运行;
6、运行维护:系统投入运行,长期的维护工作。
数据字典各部分的描述
①数据项:数据流图中数据块的数据结构中的数据项说明
数据项是不可再分的数据单位。对数据项的描述通常包括以下内容:
数据项描述={数据项名,数据项含义说明,别名,数据类型,长度,
取值范围,取值含义,与其他数据项的逻辑关系}
其中“取值范围”、“与其他数据项的逻辑关系”定义了数据的完整性约束条件,是设计数据检验功能的依据。
若干个数据项可以组成一个数据结构。
②数据结构:数据流图中数据块的数据结构说明
数据结构反映了数据之间的组合关系。一个数据结构可以由若干个数据项组成,也可以由若干个数据结构组成,或由若干个数据项和数据结构混合组成。对数据结构的描述通常包括以下内容:
数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}
③数据流:数据流图中流线的说明
数据流是数据结构在系统内传输的路径。对数据流的描述通常包括以下内容:
数据流描述={数据流名,说明,数据流来源,数据流去向,
组成:{数据结构},平均流量,高峰期流量}
其中“数据流来源”是说明该数据流来自哪个过程,即数据的来源。“数据流去向”是说明该数据流将到哪个过程去,即数据的去向。“平均流量”是指在单位时间(每天、每周、每月等)里的传输次数。“高峰期流量”则是指在高峰时期的数据流量。
④数据存储:数据流图中数据块的存储特性说明
数据存储是数据结构停留或保存的地方,也是数据流的来源和去向之一。对数据存储的描述通常包括以下内容:
数据存储描述={数据存储名,说明,编号,流入的数据流,流出的数据流,
组成:{数据结构},数据量,存取方式}
其中“数据量”是指每次存取多少数据,每天(或每小时、每周等)存取几次等信息。“存取方法”包括是批处理,还是联机处理;是检索还是更新;是顺序检索还是随机检索等。
另外“流入的数据流”要指出其来源,“流出的数据流”要指出其去向。
⑤处理过程:数据流图中功能块的说明
数据字典中只需要描述处理过程的说明性信息,通常包括以下内容:
处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流},
处理:{简要说明}}
其中“简要说明”中主要说明该处理过程的功能及处理要求。功能是指该处理过程用来做什么(而不是怎么做);处理要求包括处理频度要求,如单位时间里处理多少事务,多少数据量,响应时间要求等,这些处理要求是后面物理设计的输入及性能评价的标准。
● 储存过程
PL/SQL块主要有两种类型,即命名块和匿名块。前面介绍的是匿名块。匿名块每次执行时都要进行编译,它不能被存储到数据库中,也不能在其他的PL/SQL块中调用。存储过程和函数是命名块,他们被编译后保存在数据库中,可以被反复调用,运行速度较快。
利用存储过程来实现下面的应用:从一个账户转指定数额的款项到另外一个账户:
CREATE PROCEDURE TRANSFER(inAccount INT,outAccount INT, amount FLOAT)
AS DECLEARE
totalDeposit FLOAT;
BEGIN
/*获取账户存款数额*/
SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCOUNTNUM=outAccount;
IF totalDeposit IS NULL THEN//若账户不存在或者没有存款;则回滚
ROLLBACK;
RETURN;
END IF;
IF totalDeposit <amount THEN//若账户存款不足;则回滚
ROLLBACK;
RETURN;
END IF;
/*更新转出账户*/
UPDATE ACCOUNT SET total=total-amount WHERE ACCOUNTNUM=outAccount
/*更新转入账户*/
UPDATE ACCOUNT SET total=total+amount WHERE ACCOUNTNUM=inAccount;
COMMIT;//提交转账事务
END;
调用存储过程语法如下:
CALL/PERFORM PROCEDURE 过程名();
如:CALL PROCEDURE TRANSFER(0001,0002,10000);//0001转到0002账户10000块钱!
修改存储过程名称语法如下:
AFTER PROCEDURE 过程名1 RENAME TO 过程名2;
删除存储过程如下:
DROP PROCEDURE 过程名();
● 并发控制
封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
排它锁又称为写锁。若事务T 对数据对象A 加上X 锁,则只允许T 读取和修改A , 其它任何事务都不能再对A 加任何类型的锁,直到T 释放A 上的锁。
共享锁又称为读锁。若事务T 对数据对象A 加上S 锁,则事务T可以读A但不能修改A,则其它事务只能再对A 加S 锁,而不能加X 锁,直到T 释放A 上的S 锁。
活锁:如果事务T1封锁了数据R,事务T2又请求R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求。。。。T2有可能永远等待,这就是活锁的情形。
避免活锁的简单方法就是采用先来先服务的策略。
死锁:如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已经封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已经封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。
死锁的预防:
一次封锁法:一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。
顺序封锁法:顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
BY:AloneMonkey