赞
踩
目录
前言:
笔记来自《文老师软考数据库》教材精讲,精讲视频在b站,某宝都可以找到,个人感觉通俗易懂。
2020年以后不考了
数据库设计的考法也非常固定,第一小题补充E-R图,第二小题补充关系模式,第三小题是简单的情景问答题。同样也都不难,结合题目描述和E-R图的一些特点可以轻易得出答案,技巧如下:
1、补充E-R图:这是重中之重,E-R图如果弄错了,后续题目都有影响,主要是根据题目描述确认哪些实体之间有联系,联系类型是哪一种,而后进行连线即可,并不难。
2、补充关系模式:实际考察的是将E-R图转换为关系模式,补充缺失的属性,分成两步:首先需要审题,题目会给出每个关系模式的属性信息,先将题目中的属性信息和问题对应,将缺少的属性全部补充,而后再按照规则转换,即前面所说的规则,按联系的三种对应方式决定要添加哪些字段。
3、情景问答:一般都是给出一段新的描述,要求新增一种实体-联系类型和关系模式,本质也是考察联系类型和E-R图转换为关系模式
【几个比较重要的概念】
【第一范式1NF】
● 关系中的每一个分量必须是一个不可分的数据项。通俗地说,第一范式就是表中不允许有小表的存在。比如,对于如下的员工表,就不属于第一范式:
实例:用一个单一的关系模式学生来描述学校的教务系统学生(学号,学生姓名,系号,系主任姓名课程号,成绩)依赖关系(学号->学生姓名,学号->系号,系号->系主任姓名,学号->课程号,(学号,课程号) ->成绩)
【第二范式】
● 如果关系R属于1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R属于2NF。通俗地说,2NF就是在1NF的基础上,表中的每一个非主属性不会依赖复合主键中的某一个列。按照定义,上面的学生表就不满足2NF,因为学号不能完全确定课程号和成绩(每个学生可以选多门课)。
将学生表分解为:
● 学生(学号,学生姓名,系编号,系名,系主任)
● 选课(学号,课程号,成绩)
● 每张表均属于2NF。
第二范式消除了非主属性对主属性的部分函数依赖
【第三范式】
● 在满足1NF的基础上,表中不存在非主属性对码的传递依赖;
继续上面的实例,学生关系模式就不属于3NF,因为学生无法直接决定系主任和系名,是由学号->系编号,再由系编号->系主任,系编号->系名,因此存在非主属性对主属性的传递依赖
将学生表进一步分解为:
学生(学号,学生姓名,系编号)
系(系编号,系名,系主任)
选课(学号,课程号,成绩)
每张表都属于3NF。
【BC范式BCNF】
是指在第三范式的基础上进一步消除主属性对于码的部分函数依赖和传递依赖。通俗的来说,就是在每一种情况下,每一个依赖的左边决定因素都必然包含候选律,如下:
CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]...
[,<表级完整性约束条件>]) ;
● 列级完整性约束条件有 NULL (空)和UNTQUE(取值唯一)。
● 表级完整性约束条件有 primary key 和 foreign key 等。
- create table stu(sno int not null unique,
- sex char(6),
- departnum int,
- sname char(10),
- primary key(sno),
- foreign key(departnum) references depart (departnum));
ALTER TABLE<表名>[ADD<新列名<数据类型>[完整性约束条件]]
[DROP<完整性约束名>]
[MODIFY<列名><数据类型>];
- alter table stu add telephone char(11);
- alter table stu modify sno char(6);
DROP TABLE <表名>
drop table stu;
【索引的作用】
(1)通过创建唯一索引,可以保证数据记录的唯一性。
(2)可以大大加快数据检索速度。
(3)可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。
(4)在使用ORDER BY和GROUP BY子句中进行检索数据时,可以显著减少查中分组和排序的时间。
(5)使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能。
创建索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>ON<表名>(<列名>[<次序>][,<列名>[次序>]]... ) ;
● 次序:可选ASC (升序) 或DSC (降序) ,默认升序。
● UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录。
● CLUSTER:表明要建立的索引是聚簇索引,索引项的顺序是与表中记录的物理顺序一致的索引组织。
删除索引
DROP INDEX<索引名>
视图不是真实存在的基本表,而是一个虚拟表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。使用视图的优点和作用如下:
(1)可以使视图集中数据、简化和定制不同用户对数据库的不同数据要求。
(2)使用视图可以屏蔽数据的复杂性,用户不必了解数据库的结构,就可以方便地使用和管理数据简化数据权限管理和重新组织数据以便输出到其他应用程序中。
(3)视图可以使用户只关心他感兴趣的某些特定数据和所负责的特定任务,而那些不需要的或者无用的数据则不在视图中显示。
(4)视图大大地简化了用户对数据的操作
(5)视图可以让不同的用户以不同的方式看到不同或者相同的数据集。
(6)在某些情况下,由于表中数据量太大因此在表的设计时常将表进行水平或者垂直分割,但表的结构的变化对应用程序产生不良的影响。
(7)视图提供了一个简单而有效的安全机制。
创建视图
CREATE VIEW 视图名(列表名)
AS SELECT 查询子句[WITH CHECK OPTION];
create view cs-stu as select * from stu where depart='cs' with check option;
删除视图
drop view 视图名
drop view cs-stu;
SELECT [ALL | DISTINCT] <目标列表达式> [目标列表达式>]..
FROM <表名或视图名> [,<表名或视图名>]
[WHERE<条件表达式>]
[GROUPBY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]...]
select sno,sname from stu where depart='CS‘;
连接查询:查询涉及两个以上的表。查询选修了课程号为C1的学生号和学生姓名。
select sno,sname from SSC where S.sno=SCsno and SCcno='C1';
select sno,sname from S where sno in (select sno from SC where cno=’ C1');
● group by<列名1>[having <条件表达式>];
● group by 按某一列分组,一般只能select分组的列以及使用聚集函数
● 在group by子句后面加一个having子句,对分组设置过滤条件,可以使用聚集函数,注意:
● 空值在任何聚集操作中都会被忽视,如求和、求平均值和计数都没有影响,如count(*)是某个关系中所有元组数组之和,但count(A)却是A属性非空的元组个数之和。
● NULL值可以看做分组属性中的一个一般的值,例如,在select A,avg(B) from R中,当A的属性值为空时,就会统计A=NULL的所有元组中B的均值。
● 查找订单总金额小于2000的客户:
select customer, sum(orderPrice) from orders group by customer having sum(orderPrice) <2000;
SQL对视图更新必须遵循以下规则:
(1)从多个基本表通过连结操作导出的视图不允许更新。
(2)对使用了分组、集函数操作的视图则不允许进行更新操作。
(3)如果视图是从单个基本表通过投影、选取操作导出的则允许进行更新操作,且语法同基本表 。
外键约束foreign key
参照完整性定义格式:
foreign key(属性名)references 表名(属性)[on delete cascade set nullj;
references指明外键对应于哪个表的主键;
on delete cascade指明删除被参照关系的元组时,同时删除参照关系中的元组:
set null表示空值。
属性值上的约束,属性值上的约束通过下面关键字进行
not null:不允许空值
unique:唯一值
check:属性值要满足指定条件
- create table students (sno char(8)not null unique,
- sname char(10),
- sage int,
- sdept char(20),
- primary key(sno),
- foreign key(sdept) references D(dept),
- check(sage >=15 and sage <= 22))
GRANT<权限>[<权限>]... [ON<对象类型><对象名>)TO<用户>[,<用户]>]...[WITH GRANT OPTION]
- grant all privileges on table S,PJ to user1, user2;
- grant insert on table S to user1 with grant option;
REVOKE<权限>[,<权限>]... [ON<对象类型><对象名>]FROM<用户>[,<用户]>]... ;
revoke all privileges on table S,PJ from user1,user2;revoke select on table S from user1;
创建触发器:
(1)BEFORE:指示DBMS在执行触发语之前激发触发器
(2)AFTER:指示DBMS在执行触发语之后激发触发器。
(3)DELETE:每当一个DELETE语从表中删除一行时激发触发器。
(4)INSERT:每当一个时SERT 语句向表中插入一行时激发触发器
(5)UPDATE:每当UPDATE 语修改由OF子指定的列值时,激发触发器。如果忽略OF子,每当UDPATE 语修改表的任何列值时DBMS都将激发触发器
(6)REFERENCING<临时视图名>:指定临时视图的别名。在触发器运行过程中,系统会生成两个临时视图,分别存放被更新值 (旧值)和更新后的值(新值》。对于行级触发器,默认临时视图名分别是OLD 和NEW (oracle,在MS中,为Deleted,Inserted) ;对于语句级触发器,默认临时视图名分别是OLD-TABLE和NEW-TABLE。一旦触发器运行结束,临时视图就不在。
(7)WHEN<触发条件>:指定触发器的触发条件。当满足触发条件时,DBMS才激发触发器。触发条件中必须包含临时视图名,不包含查询。
CREATE TRIGGER<触发器名>[BEFORE | AFTER)([DELETE | INSERT | UPDATEOF [列名清单]])ON表名
[REFERENCING<临时视图名>][WHEN<触发条件>]
BEGIN
<触发动作>
END[触发器名]
【修改触发器】
ALTER TRIGGER<触发器名> [(BEFORE | AFTER]([DELETE | INSERTIUPDATEOF[列名清单]])
ON表名 | 视图名
AS
BEGIN
要执行的SQL语句
END
【删除触发器】
drop trigger trigger name
共分为三级封锁协议,如下:
一级封锁协议:事务在修改数据R之前必须先对其加X锁,直到事务结束才释放。可解决丢失更新问题:
二级封锁协议:
一级封锁协议的基础上加上事务T在读数据R之前必须先对其加S锁,读完后即可释放S锁。
可解决丢失更新、读脏数据问题:
三级封锁协议:
级封锁协议加上事务T在读取数据R之前先对其加S锁,直到事务结束才释放可解决丢失更新读脏数据、数据重复读问题
【两段锁协议】
【数据库事务的四种隔离级别】
数据库事务的四种隔离级别数据库事务的隔离级别有4个,由低到高依次为Readuncommitted、Read committed.Repeatable read、Serializable.
【游标】
一条SQL 语句可产生或处理多条记录。而主语言是面向记录的,一组主变SQL 语言是面向集合的量一次只能放一条记录,所以,引入游标,i通过移动游标指针来决定获取哪一条记录。与游标相关的SQL语句有四条:
(1)定义游标,格式如下
EXEC SOL DECLARE <游标名> CURSOR FOR
<SELECT语句>
END EXEC
这是一条说明性语句,定义中的 SELECT 语句并不立即执行。
(2) 打开游标,格式如下:
EXEC SQL OPEN <游标名> END EXEC
该语句执行游标定义中的 SELECT 语句,同时游标处于活动状况。游标是一个指针,此时指向查询结里的第一行之前。
(3)推进游标,格式如下
EXEC SQLFETCH FROM<游标名>INTO<变量表>ENDEXEC该语句使用时,游标推进一行,并把游标指向的行(称为当前行)中的值取出,送到共享变量中。变量表由用逗号分开的共享变量组成。该语句常置于宿主语言程序的循环结构中。
(4)关闭游标,格式如下:EXEC SQLCLOSE<游标名>END EXEC该语句关闭游标,使它不再和查询结果相联系。关闭了的游标,可以再次打开,与新的查询结果相联系。
系统故障(通常称为软故障):是指硬件故障、软件(如DBMS、OS 或应用程》漏的影响,导致丢失了内存中的信息,影响正在执行的事务,但未破坏存储在外存上的信息。这种情况称为故障 - 停止假设。
介质故障(称为硬件故障):是指外存故障,例如磁盘损坏、磁头碰撞,瞬时强磁场干扰等。这类故障将破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务,日志文件也被破坏。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。