这是本人整理的数据库系统原理的复习资料,按照四个课程目标所划的知识点进行复习,时间充裕的同学可对照文末各章复习知识点查漏补缺。
一、设有3个关系:
S(S#,SNAME,SEX,AGE,sdept)
SC(S#,C#,GRADE)
C(C#,CNAME,TEACHER)
用数据定义语言DDL定义上述三个表,请为每个属性定义适当的数据类型,宽度(和精度),每个表上的主键、外键以及恰当的数据完整性约束。(12.0分)
⑴、创建学生表s(4分)
create table s(
S# char(10) primary key,
sname varchar(8) not null,
sex char(2),
age int
sdept varchar(30));
⑵、创建课程表C (4分)
create table C(
C# char(4) primary key,
Cname varchar(20) not null,
teacher varchar(8) not null);
⑶、创建选课表sc (4分)
create table sc(
S# char(10),
C# char(4),
Grade int,
primary key(s#,c#),
foreign key s# references s(s#),
foreign key c# references c(c#));
给定关系R和S,如下图所示:
R
A | B | C | D |
---|---|---|---|
A1 | B1 | C1 | D1 |
A1 | B1 | C2 | D2 |
A1 | B1 | C3 | D3 |
A2 | B2 | C1 | D1 |
A2 | B2 | C2 | D2 |
A3 | B3 | C1 | D1 |
S
C | D | E |
---|---|---|
C1 | D1 | E1 |
C2 | D2 | E2 |
试计算下列结果(1)~(6)
(1)π3,4(R)∪π1,2(S)
分别对关系R、S的属性列C、D做投影。
π3,4(R):
C | D |
---|---|
C1 | D1 |
C2 | D2 |
C3 | D3 |
π1,2(S)为:
C | D |
---|---|
C1 | D1 |
C2 | D2 |
所以π3,4(R)∪π1,2(S)为:
C | D |
---|---|
C1 | D1 |
C2 | D2 |
C3 | D3 |
2)π3,4(R)-π1,2(S)
(4.0分)
正确答案:
C | D |
---|---|
C3 | D3 |
(3)σA=‘A2’(R)
(4.0分)
正确答案:
A | B | C | D |
---|---|---|---|
A2 | B2 | C1 | D1 |
A2 | B2 | C2 | D2 |
(4)R∞S,其中c为(R.C=S.C∧R.D=S.D)(4.0分)
正确答案:
④、第一步先做R╳S,为
A | B | R.C | R.D | S.C | S.D | E |
---|---|---|---|---|---|---|
A1 | B1 | C1 | D1 | C1 | D1 | E1 |
A1 | B1 | C1 | D1 | C2 | D2 | E2 |
A1 | B1 | C2 | D2 | C1 | D1 | E1 |
A1 | B1 | C2 | D2 | C2 | D2 | E2 |
A1 | B1 | C3 | D3 | C1 | D1 | E1 |
A1 | B1 | C3 | D3 | C2 | D2 | E2 |
A2 | B2 | C1 | D1 | C1 | D1 | E1 |
A2 | B2 | C1 | D1 | C2 | D2 | E2 |
A2 | B2 | C2 | D2 | C1 | D1 | E1 |
A2 | B2 | C2 | D2 | C2 | D2 | E2 |
A3 | B3 | C1 | D1 | C1 | D1 | E1 |
A3 | B3 | C1 | D1 | C2 | D2 | E2 |
第二步找出满足条件(R.C=S.A)∧(R.D=S.B)的元组,为
A | B | R.C | R.D | S.C | S.D | E |
---|---|---|---|---|---|---|
A1 | B1 | C1 | D1 | C1 | D1 | E1 |
A1 | B1 | C2 | D2 | C2 | D2 | E2 |
A2 | B2 | C1 | D1 | C1 | D1 | E1 |
A2 | B2 | C2 | D2 | C2 | D2 | E2 |
A3 | B3 | C1 | D1 | C1 | D1 | E1 |
(5)R÷S
(4.0分)
正确答案:
第一步找出R与S相同的属性列,即C列和D列
第二步找出R中剩余两列A和B的象集,即:
{A1,B1}的象集为{C1,D1}、{C2,D2}、{C3,D3}
{A2,B2}的象集为{C1,D1}、{C2,D2}
{A3,B3}的象集为{C1,D1}
第三步已知关系S中C列和D列包含的元组为{{C1,D1},{C2,D2}},而由第二步可知,{A1,B1}和{A2,B2}的象集均包含{{C1,D1},{C2,D2}}
所以,R÷S为
A | B |
---|---|
A1 | B1 |
A2 | B2 |
(6)(π1,2(R)╳π1,2(S))-R
(4.0分)
正确答案:
π1,2(R)为:
A | B |
---|---|
A1 | B1 |
A2 | B2 |
A3 | B3 |
π1,2(S)为:
C | D |
---|---|
C1 | D1 |
C2 | D2 |
则π1,2(R)╳π1,2(S)为:
R.A | R.B | S.C | S.D |
---|---|---|---|
A1 | B1 | C1 | D1 |
A1 | B1 | C2 | D2 |
A2 | B2 | C1 | D1 |
A2 | B2 | C2 | D2 |
A3 | B3 | C1 | D1 |
A3 | B3 | C2 | D2 |
所以(π1,2(R)╳π1,2(S))-R 的结果为:
R.A | R.B | S.C | S.D |
---|---|---|---|
A3 | B3 | C2 | D2 |
设有3个关系:
S(S#,SNAME,SEX,AGE)
SC(S#,C#,GRADE)
C(C#,CNAME,TEACHER)
试用关系代数表达式表示下列查询语句:(1)~(8)小题
(1)检索LIU老师所授课程的课程号和课程名;
(4.0分)
正确答案:
①、πC#,CNAME(σTEACHER=‘liu’(C))
(2)检索年龄大于23的男同学的学号和姓名;
(4.0分)
正确答案:
②、πS#,SNAME(σSEX='男’∧AGE>23(S))
(3)检索学号为S3的学生所学课程的课程名与任课老师;
(4.0分)
正确答案:
③、πCNAME,TEACHER(σS#=‘S3’(SC)∞C)
(4)检索至少选修LIU 老师所授课程中一门课程的女学生的姓名;
(4.0分)
正确答案:
④、πSNAME(σTEACHER=‘lIU’ ∧SEX=‘女’(S∞SC∞C))
(5)检索WANG同学不学课程的课程号;
(4.0分)
正确答案:
⑤、πC#(C)-πC#(σSNAME=‘WANG’(S∞SC))
(6)检索至少选修2门课的学生的学号;
(4.0分)
正确答案:
⑥、πS#(σ1=4∧2≠5(SC ╳SC))
(7)检索全部学生都选修的课程的课程号和课程名;
(4.0分)
正确答案:
⑦、πC#,CNAME((πC#, S#(SC)÷πS#(S)) ∞C)
(8)检索选修课程包含LIU老师所授全部课程的学生的学号;
(4.0分)
正确答案:
⑧、πS#,C#(SC)÷πC#(σTEACHER='LIU’(C))
(9)检索选修全部课程的学生学号
(4.0分)
正确答案:
⑨、πs#, C#(SC)÷πc#(C))
索引(聚簇索引、普通索引、唯一索引)详细讲解
2、为什么要对数据文件建立索引?
答:最明显的原因是速度。没有索引时,DBMS通过表扫描方式逐个读取指定表中的数据记录来访问,这样的查找方式就好像在图书馆里查找一本书时,将图书馆中的所有书都找一遍,这样做的效率毫无疑问是非常低的。由于索引表是排序的,可以采取类似二分查找的快速定位算法,在实际应用中,索引表还可以驻留在主存储器中,进一步提高查找的访问速度。
3、简述聚集索引和非聚集索引的区别。
答:汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。
如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。
4、为什么一个数据文件只能有一个聚集索引?
答:由于一个数据表只能有一种实际的存储顺序,因此在一个数据表中只能建立一个聚集索引。
谁可以建立索引
数据库管理员 或 表的属主(即建立表的人)
谁维护索引
关系数据库管理系统自动完成
使用索引
关系数据库管理系统自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引
建立索引
语句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
<表名>:要建索引的基本表的名字
索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
<次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
UNIQUE:此索引的每一个索引值只对应唯一的数据记录
CLUSTER:表示要建立的索引是聚簇索引
[例3.13] 为学生-课程数据库中的Student,Course,SC三个表建立索引。Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>
[例3.14] 将SC表的SCno索引名改为SCSno
ALTER INDEX SCno RENAME TO SCSno;
删除索引
DROP INDEX <索引名>;
删除索引时,系统会从数据字典中删去有关该索引的
描述。
[例3.15] 删除Student表的Stusname索引
DROP INDEX student.Stusname;
触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程
触发器保存在数据库服务器中
任何用户对表的增、删、改操作均由服务器自动激活相应的触发器
触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力
触发器是用户定义在表上的一类由事件驱动的特殊过程。当用户对表的增加、删除、修改操作均由服务器自动激活相应的触发器。并在DBMS的核心层进行完整性控制。
下面介绍SQL server中触发器机器应用。
(1)触发器的作用
触发器强制执行业务规则。 SQL server提供了两种机制来强制执行业务规则和数据完整性:约束和触发器。
(2)触发器
触发器与表紧密相连,基于表建立,可视作表的一部分。触发器在指定表中的数据发生变化时被调用,以响应insert、update和delete事件。
【说明】
(1)触发器只在触发它的语句完成后执行。
(2)如果语句在表中执行违反条件约束或引起错误,触发器不会触发。
(3)一个语句只能触发一次触发器。
创建触发器用: CREATE TRIGGER
语法格式:
CREATE TRIGGER 触发器名称
ON 表名
FOR INSERT、UPDATE 或 DELETE
AS
T-SQL 语句
注意:触发器名称是不加引号的。
触发器的应用
1. Inserted表和deleted表
SQL server为每个触发器建立两个临时表:Inserted表和deleted表。这两个表的结构与被触发器作用的表的结构相同。用户不能对它们进行修改。当触发器执行完毕后,这两个表被删除。
(1)当执行insert语句时, Inserted表存放要向表中插入的所有行。
(2)当执行delete 语句时, deleted表存放要从表中删除的所有行。
(3)当执行update语句时, 相当于先执行一个delete操作(存入deleted表),再执行一个 insert 操作(存入Inserted表) 。
deleted 与inserted 数据的差异:
Inserted表:
存放进行insert和update 操作后的数据
Deleted表:
存放进行delete 和update操作前的数据
注意:update 操作相当于先进行delete,再进行insert,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后的数据在存到触发器作用的表的同时,也同时生成一条拷贝到inserted表中。
已知:学生课程管理数据库包含以下表,请完成下列各题:
S(SNO,SNAME,SSEX,SAGE,SAGE,SDEPT);
C(CNO,CNAME,CCREDIT,CPNO);
SC(SNO.CNO,GRADE);
(1)在学生课程管理数据库中创建一触发器,当向学生选课表插入记录时,检查该记录的学号在学生表中是否存在,检查该记录的课程号在课程表中是否存在,及选课成绩是否在0到100范围,若有一项为否,则不允许插入。
(8.0分)
正确答案:
create trigger stu_ins_tri on sc for insert as begin declare @s# char(6),@c# char(5),@grade int select @s#=sno,@c#=cno,@grade=score from inserted if (@s# not in(select sno from student)) or (@c# not in (select cno from course) ) or (@grade not between 0 and 100) rollback transaction else print '成功插入' end;
(2) 建立一个update触发器,当更新sc表中的score列时,触发器检查成绩是否提高10%。如果成绩超过了10%,将以ROLLBACK语句复原触发器和调用触发器语句,并打印“成绩升幅太大,更新失败!”,否则,打印“成绩更新成功!”。
(8.0分)
正确答案:
alter trigger sc_update on sc for update as Begin transaction declare @bgrade int,@acj int select @bgrade=grade from deleted print '更新前的成绩:'+cast(@bgrade as char(5)); select @acj=grade from inserted print '更新后的成绩:'+cast(@acj as char(5)); if @acj>@bgrade*1.1 begin raiserror('成绩升幅太大,更新失败!',16,1); rollback; return end --符合 print '成绩更新成功!' commit transaction;
(3)利用update触发器,级联更新记录,即每当删除学生表S中的某条记录后,同时将SC表中该学生的选课记录一并删除。
(注意:如果SC表上由外键,请将外键约束删除,否则此触发器不会起作用)
(8.0分)
正确答案:
create trigger st_update on s for update as if update(sno) begin declare @bsno char(9),@asno char(9) print '使用update触发器级联更新sc表中相关的行-开始' select @bsno=sno from deleted print '更新前的学号:'+@bsno select @asno=sno from inserted print '更新后的学号:'+@asno update sc set sno=@asno where sc.sno=@bsno print '使用update触发器级联更新sc表中相关的行-结束' end
[例3.5] 建立“学生”表Student。学号是主码,姓名取值唯一。
CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, /* 列级完整性约束条件,Sno是主码*/ Sname CHAR(20) UNIQUE, /* Sname取唯一值*/ Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );
[例3.6 ] 建立一个“课程”表Course
CREATE TABLE Course (Cno CHAR(4) PRIMARY KEY, Cname CHAR(40), Cpno CHAR(4), Ccredit SMALLINT, FOREIGN KEY (Cpno) REFERENCES Course(Cno) );
[例3.7] 建立一个学生选课表SC
CREATE TABLE SC( Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY (Sno,Cno), /* 主码由两个属性构成,必须作为表级完整性进行定义*/ FOREIGN KEY (Sno) REFERENCES Student(Sno), /* 表级完整性约束条件,Sno是外码,被参照表是Student */ FOREIGN KEY (Cno)REFERENCES Course(Cno) /* 表级完整性约束条件, Cno是外码,被参照表是Course*/ );
[例3.8] 向Student表增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student ADD S_entrance DATE;
不管基本表中原来是否已有数据,新增加的列一律为空值
[例3.9] 将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
[例3.10] 增加课程名称必须取唯一值的约束条件。
ALTER TABLE Course ADD UNIQUE(Cname);
删除基本表
DROP TABLE <表名>[RESTRICT| CASCADE];
RESTRICT:删除表是有限制的。
欲删除的基本表不能被其他表的约束所引用
如果存在依赖该表的对象,则此表不能被删除
CASCADE:删除该表没有限制。
在删除基本表的同时,相关的依赖对象一起删除
[例3.11] 删除Student表
DROP TABLE Student CASCADE;
基本表定义被删除,数据被删除
表上建立的索引、视图、触发器等一般也将被删除
[例3.12 ]若表上建有视图,选择RESTRICT时表不能删除;选择CASCADE时可以删除表,视图也自动删除。
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS'; DROP TABLE Student RESTRICT; --ERROR: cannot drop table Student because other objects depend on it
[例3.12续]如果选择CASCADE时可以删除表,视图也自动被删除
DROP TABLE Student CASCADE; --NOTICE: drop cascades to view IS_Student SELECT * FROM IS_Student; --ERROR: relation " IS_Student " does not exist
建立IS系学生视图IS_student,并保证进行修改和插入操作时仍保证该视图只有信息系的学生;
用SELECT语句完成下列(1)~(12)查询。
(4.0分)
正确答案:
(1)、select c#,cname from C
where teacher=‘LIU’;
(4.0分)
正确答案:
(2)、select s#,sname from S
where sex=‘男’ and age>23;
(4.0分)
正确答案:
(3)、select cname,teacher from C
where c# in(select c# from SC where s#=‘S3’);
或者:
select cname,teacher from C,sc
where c.c#= s.c# and sc.s#=‘S3’);
(4.0分)
正确答案:
(4)、select sname from S
where sex=‘女’ and s# in(select distinct s# from SC
where c# in(select c# from C
where teacher=‘LIU’));
或者:
select sname
from S,SC,C
where sex=‘女’ and S.s# =SC. s# AND SC.C#=C.C# AND teacher=‘LIU’;
(4.0分)
正确答案:
(5)select distinct c# from C
where c# not in(select distinct c# from sc
where s# in (select s# from s where sname=‘WANG’));
(4.0分)
正确答案:
(6)select distinct a.s# from SC as a,SC as b
where a.s#=b.s# and a.c#!=b.c#;
或者:
select distinct s# from SC group by s# having count(c#)>=2;
(4.0分)
正确答案:
(7)select c#,cname from c
where not exists(select * from s where not exists(
select * from sc where s#=s.s# and c#=c.c#);
或者:
select c#,cname from c
where c# in(select c# from sc
group by c#
having count(s#)=(select count(*) from s);
(4.0分)
正确答案:
(8)select distinct s# from sc a
where not exists(select * from c where teacher=‘LIU’
and not exists(select * from sc as b
where b.s#=a.s# and b.c#=c.c#));
(4.0分)
正确答案:
(9) SELECT * FROM S WHERE SNAME LIKE ‘张%’;
(4.0分)
正确答案:
(10)SELECT S#,AVG(GRADE) FROM SC GROUP BY S#;
(4.0分)
正确答案:
(11)SELECT S#,SNAME
FROM S
WHERE S# IN(SELECT S# FROM SC
GROUP BY S# HAVING AVG(GRADE)>=80);
(4.0分)
正确答案:
(12)SELECT S#,SNAME
FROM S
WHERE S# IN (SELECT TOP 1 S# FROM SC
GROUP BY S#
ORDER BY AVG(GRADE) DESC);
(2.0分)
正确答案:
(1)Update s
Set age=age+1;
(3.0分)
正确答案:
(2)Update sc
Set grade=0
Where c# in(select c# from c where teacher=‘LIU’);
(3.0分)
正确答案:
(3)DELETE FROM SC
WHERE S# IN(SELECT S# FROM S
WHERE SEX=‘女’);
(2.0分)
正确答案:
(4)–先删除子表SC表
Delete from sc
–然后删除主表S
DELETE FROM S;
(2.0分)
正确答案:
(5)insert into s values(‘1006’,‘黎明’,‘男’,20);
(4.0分)
正确答案:
第一空:
grant select ,insert on books to user3;
(4.0分)
正确答案:
第一空:
grant insert,delete,update on books to user2 with grant option;
(4.0分)
正确答案:
第一空:
REVOKE SELECT ON S FROM PUBLIC;
(4.0分)
正确答案:
第一空:
revoke insert,delete,update on books from user2;
(4.0分)
正确答案:
第一空:
grant delete on books to user3;
(4.0分)
正确答案:
第一空:
REVOKE ALTER TABLE FROM 张希;
(1)请首先创建王明所在系的视图V_Wangming,不允许王明将来透过视图修改其他系的学生数据。
(2)将此视图的修改王明所在系的权限授予王明。
(4.0分)
正确答案:
第一空:
create view V_Wangming as select * from s where sname='王明' with check option;
第二空:
GRANT update(sdept) ON V_Wangming TO 王明;
用户张希具有修改表结构的权力。
(4.0分)
正确答案:
第一空:
grant alter table to 张希;
把对学生表S的查询权限授予Public角色。
(4.0分)
正确答案:
第一空:
GRANT SELECT ON S TO PUBLIC;
假设教学管理规定:
①一个学生可选修多门课,一门课有若干学生选修;
②一个教师可讲授多门课,一门课只有一个教师讲授;
③一个学生选修一门课,仅有一个成绩。
学生的属性有学号、学生姓名;教师的属性有教师编号,教师姓名;课程的属性有课程号、课程名。
要求:根据上述语义画出ER图,要求在图中画出实体的属性并注明联系的类型;
(10.0分)
正确答案:
对于上面这题
实体:学生、课程、教师
实体的属性:学生(学号、姓名)、课程(课程号、课程名)、教师(教师编号、教师姓名)
实体的码:学号、课程号、教师编号(E_R图中应当划横线)
实体之间的联系:学生和课程多对多、教师和课程一对多
学生(学号、姓名)
课程(课程号、课程名)
教师(教师编号、教师姓名)
课程(课程号、课程名、教师编号)
选修(学号、课程号、成绩)
学生(学号、姓名)
课程(课程号、课程名、教师编号)
教师(教师编号、教师姓名)
选修(学号、课程号、成绩)
1、若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何、子集都不能再标识,则称该属性组为(超级码)候选码。
2、例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的属性组合足以区分学生实体,那么{学号}和{姓名,班级}都是(超级码)候选码。
3、简单的说,候选码(超级码)就是可以被选为主码的属性或属性组。当一个关系有N个属性或属性组可以唯一标识时,则说明该关系有N个候选码,可以选定其中一个作为主码。
4、候选码中出现过的属性称为主属性;非主属性就是不包含在任何候选码中的属性
5、例如:关系 工人(工号,身份证号,姓名,性别,部门).显然工号和身份证号都能够唯一标示这个关系,所以都是候选码。工号、身份证号这两个属性就是主属性。如果主码是一个属性组,那么属性组中的属性都是主属性。
非主属性只依赖于主码的一部分就不符合2NF
A→B→C,若A,B为主码,则存在传递依赖
假设仓库管理关系表为StorehouseManage(仓库ID,存储物品ID,管理员ID,数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。
这个数据库表中存在如下决定关系:
(仓库ID,存储物品ID)→(管理员ID,数量)
(管理员ID,存储物品ID)→(仓库ID,数量)
所以,(仓库ID,存储物品ID)和(管理员ID,存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID)→(管理员ID)
(管理员ID)→(仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。
综合题
已知学生关系模式
S(Sno,Sname,SD,Sdname,Course,Grade)
其中:Sno学号、Sname姓名、SD系名、Sdname系主任名、Course课程、Grade成绩。
(1)写出关系模式S的基本函数依赖和主码。(10 分)
(2)原关系模式S为几范式?为什么?分解成高一级范式,并说明为什么? (10分)
(3)将关系模式分解成3NF,并说明为什么? (10)
(30.0分)
正确答案:
(1)写出关系模式S的基本函数依赖和主码。
答: 关系模式S的基本函数依赖如下:
Sno→Sname,
SD→Sdname,
Sno→SD,
(Sno,Course) →Grade
关系模式S的码为:(Sno,Course)。
(2)原关系模式S为几范式?为什么?分解成高一级范式,并说明为什么?
答:原关系模式S是属于1NF的,码为(Sno,Course),非主属性中的成绩完全依赖于码,而其它非主属性对码的函数依赖为部分函数依赖,所以不属于2NF。
消除非主属性对码的函数依赖为部分函数依赖,将关系模式分解成2NF如下:
S1(Sno,Sname,SD,Sdname)
S2(Sno,Course,Grade)
(3)将关系模式分解成3NF,并说明为什么?
答: 将上述关系模式分解成3NF如下:
关系模式S1中存在Sno→SD,SD→Sdname,即非主属性Sdname传递依赖于Sno,所以S1不是3NF。进一步分解如下:
S11(Sno,Sname,SD) S12(SD,Sdname)
分解后的关系模式S11、S12满足3NF。
对关系模式S2不存在非主属性对码的传递依赖,故属于3NF。所以,原模式S(Sno,Sname,SD,Sdname,Course,Grade)按如下分解满足3NF。
S11(Sno,Sname,SD)
S12(SD,Sdname)
S2(Sno,Course,Grade)
记号
R(x):读数据x
W(x):写数据x
事务和程序是两个概念
在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序
一个程序通常包含多个事务
事务是恢复和并发控制的基本单位
COMMIT
事务正常结束
提交事务的所有操作(读+更新)
事务中所有对数据库的更新写回到磁盘上的物理数据库中
ROLLBACK
事务异常终止
事务运行的过程中发生了故障,不能继续执行
系统将事务中对数据库的所有已完成的操作全部撤销
事务滚回到开始时的状态
原子性(Atomicity)
事务是数据库的逻辑工作单位
事务中包括的诸操作要么都做,要么都不做
一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
一致性状态
数据库中只包含成功事务提交的结果
不一致状态
数据库系统运行中发生故障,有些事务尚未完成就被迫中断;
这些未完成事务对数据库所做的修改有一部分已写入物
理数据库,这时数据库就处于一种不正确的状态
隔离性(Isolation)
一个事务的执行不能被其他事务干扰
一个事务内部的操作及使用的数据对其他并发事务是隔离的
并发执行的各个事务之间不能互相干扰
持续性(Durability )
持续性也称永久性(Permanence)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
接下来的其他操作或故障不应该对其执行结果有任何影响。
1.丢失修改(Lost Update)
两个事务T1和T2读入同一数据并修改,T2的提交结果破坏了T1提交的结果,导致T1的修改被丢失。
上面飞机订票例子就属此类
2.不可重复读(Non-repeatable Read)
不可重复读是指事务T1读取数据后,事务T2
执行更新操作,使T1无法再现前一次读取结果。
不可重复读包括三种情况:
(1)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时,得到与前一次不同的值
(2)事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘地消失了。
(3)事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
后两种不可重复读有时也称为幻影现象(Phantom Row)
3.读“脏”数据(Dirty Read)
读“脏”数据是指:
事务T1修改某一数据,并将其写回磁盘
事务T2读取同一数据后,T1由于某种原因被撤销
这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致
T2读到的数据就为“脏”数据,即不正确的数据
封锁(Locking)
封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
封锁是实现并发控制的一个非常重要的技术
一个事务对某个数据对象加锁后究竟拥有什么样的控制由封锁的类型决定。
基本封锁类型
排它锁(Exclusive Locks,简记为X锁)
共享锁(Share Locks,简记为S锁)
排它锁又称为写锁
若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁
保证其他事务在T释放A上的锁之前不能再读取和修改A
共享锁又称为读锁
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁
保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改
在锁的相容矩阵中:
最左边一列表示事务T1已经获得的数据对象上的锁的类型,其中横线表示没有加锁。
最上面一行表示另一事务T2对同一数据对象发出的封锁请求。
T2的封锁请求能否被满足用矩阵中的Y和N表示
Y表示事务T2的封锁要求与T1已持有的锁相容,封锁请求可以满足
N表示T2的封锁请求与T1已持有的锁冲突,T2的请求被拒绝
什么是封锁协议
在运用X锁和S锁对数据对象加锁时,需要约定一些规则,这些规则为封锁协议(Locking Protocol)。
何时申请X锁或S锁
持锁时间
何时释放
对封锁方式规定不同的规则,就形成了各种不同的封锁协议,它们分别在不同的程度上为并发操作的正确调度提供一定的保证。
三级封锁协议
1.一级封锁协议
2.二级封锁协议
3.三级封锁协议
一级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
正常结束(COMMIT)
非正常结束(ROLLBACK)
一级封锁协议可防止丢失修改,并保证事务T是可恢复的。
在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。
二级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其
加S锁,读完后即可释放S锁。
二级封锁协议可以防止丢失修改和读“脏”数据。
在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
三级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
三级封锁协议可防止丢失修改、读脏数据和不可重复读。
Data DB DBMS DBS概念
数据管理的三个阶段
数据库系统的特点
数据模型分类及三要素
联系类型
三级模式两级映像的概念及作用
数据库独立性概念
关系基本性质,
关系完整性定义,三类完整性(实体完整性 参照完整性 用户定义完整性)的含义,以及具体的应用
关系代数传统集合运:,并、交、差 、笛卡儿积
关系代数表达式的写法:选择、投影、连接、除,以及根据表中具体数据可以分析相应的结果
查询 更新sql语句(单表查询 多表查询 统计查询, not exists,分组查询 删除 添加 修改)
视图的创建
存储过程和触发器的定义
触发器类型(insert ,delect, update)
Sql server中触发器的inserted和deleted表的结构及值
触发器和存储过程的应用编程
几个范式的基本概念
函数依赖的概念(根据联系写函数依赖)
候选码的确定(根据函数依赖确定候选码)、
范式的判断及分解:1NF->2Nf->3NF,分别消除什么函数依赖?
索引的概念及作用、索引的种类(聚簇索引,非聚簇索引等)
建立索引的基本原则
数据库设计步骤及每个步骤的主要任务
E_R模型中联系转换为关系模式的基本原则
E_R模型的画法 E_R模型转换为关系模式
Grant、 revoke语句的语法
事务基本概念及其特点 ACID
数据库恢复的基本技术(冗余)
两种冗余数据(日志文件 数据库后备副本)
静态转储和动态转储的定义及优缺点
并发控制采用的技术—封锁
并发操作的数据不一致的三种情况(丢失修改、不可重复读、读脏数据)
可串行化调度的基本概念;并发调度正确性的判断准则是什么?
锁的基本类型及其概念
一、二、三级封锁协议的含义及其应用,哪些可以解决:丢失修改、不可重复读、读脏数据?