数据库系统原理课后答案 - 图文 下载本文

WHERE SNAME LIKE 'WANG%'

(7)在SC中检索成绩为空值的学生学号和课程号。 SELECT S#,C# FROM SC

WHERE GRADE IS NULL

(8)年龄大于女同学平均年龄的男学生姓名和年龄。 SELECT SNAME,AGE FROM S AS X

WHERE X.SEX='男' AND X.AGE>(SELECT AVG(AGE) FROM S AS Y WHERE Y.SEX='女')

(9)求年龄大于所有女同学年龄的男学生姓名和年龄。 SELECT SNAME,AGE FROM S AS X

WHERE X.SEX='男' AND X.AGE>ALL (SELECT AGE FROM S AS Y WHERE Y.SEX='女') 5.7 试用SQL更新语句表达对教学数据库中三个基本表S、SC、C的各个更新操作: (1)往基本表S中插入一个学生元组(‘S9’,‘WU’,18)。 INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)

(2)在基本表S中检索每一门课程成绩都大于等于80分的学生学号、姓名和性别, 并把检索到的值送往另一个已存在的基本表STUDENT(S#,SANME,SEX)。 INSERT INTO STUDENT(S#,SNAME,SEX) SELECT S#,SNAME,SEX

FROM S WHERE NOT EXISTS (SELECT * FROM SC WHERE GRADE<80 AND S.S#=SC.S#)

(3)在基本表SC中删除尚无成绩的选课元组。 DELETE FROM SC

WHERE GRADE IS NULL

(4)把WANG同学的学习选课和成绩全部删去。 DELETE FROM SC WHERE S# IN (SELECT S# FROM S

WHERE SNAME='WANG')

(5)把选修MATHS课不及格的成绩全改为空值。 UPDATE SC

SET GRADE=NULL

WHERE GRADE<60 AND C# IN (SELECT C# FROM C

WHERE CNAME='MATHS')

(6)把低于总平均成绩的女同学成绩提高5%。 UPDATE SC

SET GRADE=GRADE*1.05

WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S# FROM S WHERE SEX='F') (7)在基本表SC中修改C4课程的成绩,若成绩小于等于75分时提高5%, 若成绩大于75分时提高4%(用两个UPDATE语句实现)。 UPDATE SC

SET GRADE=GRADE*1.05

WHERE C#='C4' AND GRADE<=75 UPDATE SC

SET GRADE=GRADE*1.04

WHERE C#='C4' AND GRADE>75

5.8 在第1章例1.4中提到“仓库管理”关系模型有五个关系模式: 零件 PART(P#,PNAME,COLOR,WEIGHT) 项目 PROJECT(J#,JNAME,DATE) 供应商 SUPPLIER(S#,SNAME,SADDR) 供应 P_P(J#,P#,TOTOAL)

采购 P_S(P#,S#,QUANTITY)

(1)试用SQL DDL语句定义上述五个基本表,并说明主键和外键。 CREATE TABLE PART

(P# CHAR(4) NOT NULL,PNAME CHAR(12) NOT NULL, COLOR CHAR(10),WEIGHT REAL, PRIMARY KEY(P#)) CREATE TABLE PROJECT

(J# CHAR(4) NOT NULL,JNAME CHAR(12) NOT NULL, DATE DATE,

PRIMARY KEY(J#))

CREATE TABLE SUPLIER

(S# CHAR(4) NOT NULL,SNAME CHAR(12),SADDR VARCHAR(20), PRIMARY KEY(S#))

CREATE TABLE P_P

(J# CHAR(4),P# CHAR(4),TOTAL INTEGER, PRIMARY KEY(J#,P#),

FOREIGN KEY(J#) REFERENCE PROJECT(J#), FOREIGN KEY(P#) REFERENCE PART(P#))

CREATE TABLE P_S

(P# CHAR(4),S# CHAR(4),QUANTITY INTEGER, PRIMARY KEY(P#,S#),

FOREIGN KEY(P#) REFERENCE PART(P#), FOREIGN KEY(S#) REFERENCE SUPLIER(S#)) (2)试将PROGECT、P_P、PART三个基本表的自然联接定义为一个视图VIEW1,PART、P_S、SUPPLIER 三个基本表的自然联接定义为一个视图VIEW2。

CREATE VIEW VIEW1(J#,JNAME,DATE,P#,PNAME,COLOR,WEIGHT,TOTAL)

AS SELECT PROJECT.J#,JNAME,DATE,PART.P#,PNAME,COLOR,WEIGHT,TOTAL FROM PROJECT,PART,P_P

WHERE PART.P#=P_P.P# AND P_P.J#=PROJECT.J#

CREATE VIEW VIEW2(P#,PNAME,COLOR,WEIGHT,S#,SNAME,SADDR,QUANTITY)

AS SELECT PART.P#,PNAME,COLOR,WEIGHT,SUPPLIER.S#,SNAME,SADDR,QUANTITY FROM PART,P_S,SUPPLIER

WHERE PART.P#=P_S.P# AND P_S.S#=SUPPLIER.S# (3)试在上述两个视图的基础上进行数据查询:

1)检索上海的供应商所供应的零件的编号和名字。 SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI' 2)检索项目J4所用零件的供应商编号和名字。

SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4') 5.9 对于教学数据库中基本表SC,已建立下列视图:

CREATE VIEW S_GRADE(S#,C_NUM,AVG_GRADE) AS SELECT S#,COUNT(C#),AVG(GRADE) FROM SC

GROUP BY S#

试判断下列查询和更新是否允许执行。若允许,写出转换到基本表SC上的相应操作。 (1) SELECT *

FROM S_GRADE 允许

SELECT S#,COUNT(C#),AVG(GRADE) FROM SC GROUP BY S# (2) SELECT S#,C_NUM FROM S_GRADE

WHERE AVG_GRADE>80 允许

SELECT S#,COUNT(C#) FROM SC WHERE AVG(GRADE)>80

(3) SELECT S#,AVG_GRADE FROM S_GRADE

WHERE C_NUM>(SELECT C_NUM FROM S_GRADE

WHERE S#=‘S4’) 允许

SELECT S#,AVG(GRADE) FROM SC AS X

WHERE COUNT(X.C#)>(SELECT COUNT(Y.C#) FROM SC AS Y WHERE Y.S#='S4') GROUP BY S#

(4) UPDATE S_GRADE

SET C_NUM=C_NUM+1 WHERE S#=‘S4’ 不允许

(5) DELETE FROM S_GRADE WHERE C_NUM>4 不允许

5.10 预处理方式对于嵌入式SQL的实现有什么重要意义?

预处理方式是先用预处理程序对源程序进行扫描,识别出SQL语句,并处理成宿主语言的函数调用形式; 然后再用宿主语言的编译程序把源程序编译成目标程序。这样,不用扩充宿主语言的编译程序, 就能处理SQL语句。

5. 11 在宿主语言的程序中使用SQL语句有哪些规定? 在宿主语言的程序中使用SLQ语句有以下规定: (1)在程序中要区分SQL语句与宿主语言语句

(2)允许嵌入的SQL语句引用宿主语言的程序变量(称为共享变量),但有两条规定: 1)引用时,这些变量前必须加“:”作为前缀标识,以示与数据库中变量有区别。 2)这些变量由宿主语言的程序定义,并用SQL的DECLARE语句说明。

(3)SQL的集合处理方式与宿主语言单记录处理方式之间要协调。 需要采用游标机制,把集合操作转换成单记录处理方式。

5.12 SQL的集合处理方式与宿主语言单记录处理方式之间如何协调? 由于SQL语句处理的是记录集合,而宿主语言语句一次只能处理一个记录, 因此需要用游标(cousor)机制,把集合操作转换成单记录处理方式。

5.13 嵌入式SQL语句何时不必涉及到游标?何时必须涉及到游标?

(1)INSERT、DELETE、UPDATE语句,查询结果肯定是单元组时的SELECT语句, 都可直接嵌入在主程序中使用,不必涉及到游标。

(2)当SELECT语句查询结果是多个元组时,此时宿主语言程序无法使用, 一定要用游标机制把多个元组一次一个地传送给宿主语言处理。

自考数据库系统原理 第六章 数据库管理 课后习题答案 名词解释

(1)事务:事务是指一个操作序列,这些操作要么什么都做,要么都不做,是一个不可分割的工作单位, 是数据库环境中的逻辑工作单位,相当于操作系统环境下的\进程\概念。

(2)封锁:封锁就是事务可以向系统发出请求,对某个数据对象加锁,此事务对这个数据对象有一定控制, 而其他事务则不能更新数据直到事务释放它的锁为止。

(3)X封锁:如果事务T对数据R实现X封锁,那么其他的事务要等T解除X封锁以后,才能对这个数据进行封锁。 只有获准X封锁的事务,才能对被封锁的数据进行修改。

(4)PX协议:X封锁的规则称为PX协议,其内容为:任何企图更新记录R的事务必须先执行LOCK X(R)操作, 以获得对该记录进行寻址的能力,并对它取得X封锁。如果未获得X封锁,那么这个事务进入等待状态, 一直到获准X封锁,事务继续进行。

(5)PXC协议:它由PX协议及一条规则\封锁必须保留到事务终点(COMMIT或ROLLBACK)\组成。 (6)死锁:有两个或以上的事务处于等待状态,每个事务都在等待另一个事务解除封锁, 它才能继续执行下去,结果任何一个事务都无法执行,这种现象就是死锁。 (7)串行调度:多个事务依次执行,称为串行调度。

(8)并发调度:利用分时的方法,同时处理多个事务,称为事务的并发调度。

(9)可串行化调度:如果某事务集的一个并发调度的结果与某个串行调度等价, 则称此并发调度是是可串行化调度。

(10)不可串行化调度:某事务集的一个并发调度结果,如果与任一串行调度均不等价,则该并发调度是不可串行化调度。

(11)S封锁:共享型封锁。如果事务T对某数据R加上S封锁,那么其它事务对数据R的X封锁便不能成功, 而对数据R的S封锁请求可以成功。这就保证了其他事务可以读取R但不能修改R,直到事务T释放S封锁。 (12)PS协议:任何要更新记录R的事务必须先执行LOCK S(R)操作,以获得对该记录寻址的能力并对它取得S封锁。 如果未获准S封锁,那么这个事务进入等待状态,一直到获准S封锁,事务才继续进行下去。 当事务获准对记录R的S封锁后,在记录R修改前必须把S封锁升级为X封锁。 (13)PSC协议:由PS协议和“将S封锁保持到事务终点”组成。 任何更新记录R的事务必须先执行LOCK S(R)操作,以获得对该记录寻址的能力并对它取得S封锁。 如果未获准S封锁,那么这个事务进入等待状态,一直到获准S封锁,事务才继续进行下去。并将S封锁保持到事务终点。

(14)两段封锁协议:(1)在对任何数据进行读写操作之前,事务首先要获得对该数据的封锁; (2)在释放一个封锁之后,事务不再获得任何其他封锁。

6.2 试叙事务的四个性质,并解释每一个性质对DBS有什么益处? 事务的四个性质是:原子性、一致性、隔离性和持久性。

(1)原子性(具体含义见教材):事务中所有操作应视为整体,不可分割。

(2)一致性(具体含义见教材):一个事务独立执行的结果将保证数据库的一致性,即数据不会因事务的执行而遭受破坏。

(3)隔离性(具体含义见教材):隔离性要求在并发事务被执行时,系统应保证与这些事务先后单独执行时结果一样, 使事务如同在单用户环境下执行一样。

(4)持久性(具体含义见教材):要求事务对数据库的所有更新应永久地反映在数据库中。 6.3 事务的COMMIT操作和ROLLBACK操作各做些什么事情?

COMMIT操作表示事务成功地结束(提交),此时告诉系统,数据库要进入一个新的正确状态, 该事务对数据库的所有更新都已交付实施。

ROLLBACK操作表示事务不成功地结束,此时告诉系统,已发生错误,数据库可能处在不正确的状态, 该事务对数据库的更新必须被撤销,数据库应恢复该事务到初始状态。 6.4 UNDO操作和REDO操作各做些什么事情?

UNDO操作是反向扫描\日志\文件,撤销对数据库的更新操作,使数据库恢复到更新前的状态; REDO操作正向扫描日志文件,重新做一次更新,使数据库恢复到更新后的状态。 6.5 DBS中有哪些类型的故障?哪些故障破坏了数据库? 哪些故障未破坏数据库,但其中某些数据变得不正确? 数据库系统故障有事务故障、系统故障、介质故障。

其中介质故障破坏数据库,事务故障、系统故障未破坏数据库但使其中某些数据变得不正确。