----- -- - - -- - -- - -- - -- - -- - -- : ---业---专 ---- - -- - -- - -- - -- - -- - -- : 级 年 线 - 封 : 院-学 密 - - -- - -- -: ---名--姓 ---- -- - -- - - -- - -- - -- - -- - -- - -: ---号---学--
-国防科技大学2008-2009学年春季学期 《数据库技术基础》考试参考答案
考试形式: 开卷 考试时间: 150 分钟 满分: 100 分。
题 号 一 二 三 四 五 六 七 八 九 总分 得 分 评阅人 注意:1、所有答题都须写在此试卷纸密封线右边,写在其它纸上一律无效。 2、密封线左边请勿答题,密封线外不得有姓名及相关标记。
得分 一、问答题(共3小题,每小题5分,共15分)
1、有如下查询Q1和Q2: Q1:SELECT * FROM R; Q2:(SELECT * FROM R)
INTERSECT (SELECT * FROM R);
Q1和Q2是否产生同样的结果,为什么?
答:如果R中有重复的记录时,Q1和Q2结果不一样。因为Q2中的INTERSECT是集合运算,去除了重复的记录。
2、比较完整性约束中的主键约束(PRIMARY KEY)和唯一性约束(UNIQUE),至少说明它们的两个不同之处。
答:每个表中只能有1个PRIMARY KEY属性或属性组,但是能够有多个UNIQUE属性;PRIMARY KEY属性或属性组不能为NULL,但UNIQUE属性可以为NULL。
3、什么是事务的ACID性质?
答:“A”表示“原子性”,即事务的操作要么全部被执行,要么全部不被执行; “I”表示“独立性”,每个事务的执行必须显现为如同没有其他事务在同时执行; “D”表示“持久性”,即一旦事务已经完成,则该事务对数据库的影响就永远不会消失;
“C”表示“一致性”,即要求事务的执行要保持数据库的一致性。 得分 TRUE (T)、FALSE (F)和UNKNOWN (U)作为变量X、Y和Z的全部可能取值,
二、填空题(共5小题,每小题1分,共5分)
用T、F和U填写下表。
解:
X Y Z (X AND Y) OR (NOT Z)
U U T T T U F F
F U F T
U U T U
U U U U
得分 三、解答题(共5小题,每小题4分,共20分)
考虑如下关系表,每个关系的主键用下划线标明。
employee(EID, name, salary, DNo)表示雇员ID、姓名、工资、所在的部门编号。
department(DNo, DeptName, MgrID)表示部门编号、部门名称和该部门的经理ID。
project(PNo, location, ProjName)表示项目的编号、地点、项目名称。
HourLog(EID, PNo, hours)表示雇员(EID)为项目(PNo)工作的小时数(hours)。
假定每个部门只有1个经理,每个雇员可以参加多个项目(包括0个),每个项
目至少有1个雇员参加,HourLog关系列出了雇员参加的项目的工作小时数。
----- -- - - -- - -- - -- - -- - -- - -- : ---业---专 ---- - -- - -- - -- - -- - -- - -- : 级 年 线 - 封 : 院-学 密 - - -- - -- -: ---名--姓 ---- -- - -- - - -- - -- - -- - -- - -- - -: ---号---学
---1、用关系代数表达查询:找出为一个项目工作时数超过
100的雇员的ID和姓名。
解:
?EID,Name(?hours?100(employee??hourlog))
2、用关系代数表达查询:找出没有参加任何项目的雇员的姓名。 解:
?Name(employee)??Name(employee??hourlog)
或
?Name(employee??(?EID(employee)??EID(hourlog)))
3、用SQL表达查询:找出是部门D10并且参加项目P345的雇员姓名和ID。解:
SELECT Name, Employee.EID FROM Employee, Hourlog
WHERE Employee.DNo = ‘D10’ AND
Employee.EID = Hourlog.EID AND Hourlog.PNo = ‘P345’;.
或
SELECT Name, EID FROM Employee
WHERE DNo = ’D10’ AND
EID IN (SELECT EID
FROM Hourlog
WHRERE PNo = ’P345’);.
4、用SQL表达查询:找出至少参加了2个项目的雇员的ID和姓名。 解:SELECT employee.EID, name
FROM employee, HourLog
WHERE employee.EID = HourLog.EID GROUP BY employee.EID, name HAVING COUNT(PNo) >= 2;