第3章 关系模型
3.1 关系和关系模式有什么区别?
答:在数学上将关系定义为一系列域上的笛卡尔积的子集。所谓数据库模式就是数据库在逻辑层的总体设计,一般简称模式;针对关系模型来说,数据库模式就是关系模式。
形象的说,关系模式的概念和程序设计语言中“数据类型”的概念类似;关系的概念和程序设计语言中数据类型的“变量”的概念类似。如图3-1所示。
图3-1关系模型与程序设计言
中数据类型的类比
3.2 列出在数据库中引入空值的两个原因。
答:空值null是所有可能域的成员,表示“值未知或不存在”。因此引入空值的原因一:值未知;原因二:表示值不存在。
3.3 为什么要在数据库中定义视图?
答:基于以下三点原因,希望用户和编程人员工作在视图层上:
1. 出于安全上的考虑,不希望用户看到整个数据库的逻辑模式,而要隐藏
掉部分数据;
2. 希望产生比逻辑模式更加符合特定用户习惯的关系集合,也就是人们常
说的个性化服务;
3. 如果应用程序基于视图层的视图,就更容易实现逻辑数据独立性!
3.4 使用下面的关系代数表达式表示所有与Smith居住在同一城市同一街道的客户姓名。
?name(?name??\Smith\(customer???street,city(?name?\Smith\(customer))))
3.5 基于本章讲到的关系模式和关系,用关系代数表达式表示上课地点在三教的那些课程的开课教师所在系的名称。 答:题目所求的关系代数表达式为:
?department_name(teacher???teacher_number(teaching???course_location like \三教\(course)))
3.6 基于本章讲到的关系模式和关系,用自然语言连接表示以下查询:找出所有既有教师讲授又有学生选修的课程名称。 答:所求自然连接表达式为:
?course_name(selecting??teaching)
3.7 设r(R)和s(S)是两个关系,并且S是R的子集,那么有
r?s??R?S(r)??R?S((?R?S(r)?s)??R?S,S(r))
请分析此表达式的正确性。 答: 此表达式正确。分析如下:
首先:关系r?s,r(R)和s(S)之间的关系可用下图表示。
… t … r?s s ts1 ts2 ts3 r tr1: t+ts1 tr2: t+ts2 tr3: t+ts3
其次:在表达式r?s??R?S(r)??R?S((?R?S(r)?s)??R?S,S(r))中, 表达式了?R?S,S(r)?r,因此?R?S((?R?S(r)?s)??R?S,S(r))可化简为
?R?S((?R?S(r)?s)?r)。
由r?s和上图可以得出如下形式化描述:
定理1:不妨设关系s中有n个元组tsi(1?i?n),若t?(r?s),对?tsi?s,则有tri:t?tsi?r(1?i?n),反之亦然。
?R?S(r)?s:表示对r中任一个元组tr,记tr[R?S]?t,则有
trsi:t?tsi?(?R?S(r)?s)(1?i?n)。
因此若r中存在形如tri:t?tsi?r(1?i?n)的n个元组,则由表达式
?R?S((?R?S(r)?s)?r)就可以保证在其结果中不存在元组t,因此必定有t?(?R?S(r)??R?S((?R?S(r)?s)??R?S,S(r)))。
反之若某个tri:t?tsi?r(1?i?n),则在结果?R?S((?R?S(r)?s)?r)中
必定包含元组t,从而在结果?R?S(r)??R?S((?R?S(r)?s)??R?S,S(r))中不包含元组t。
题目表达式左部满足定理1描述,因此表达式成立,即描述正确。 附:本章所讲到的关系模式有:
1.Student_schema = (student_number, student_name, department_name)
2.Department_schema= (department_name, department_location, department_leader) 3.Course_schema = (course_name, course_location, course_capacity) 4.Selecting_schema = (student_number, course_name)
5.Teacher_schema = (teacher_number, teacher_name, teacher_age, department_name) 6.Teaching_schema = (teacher_number, course_name)
第4章 关系数据库查询语言SQL
4.1 如下所示是一个保险公司的数据库,其中加下划线的是主码。对这个关系数据库用SQL回答以下问题:
Person(ss,name,address) Car(license,year,model)
Accident(date,driver,damage) Owns(ss,license)
Log(license,date,driver)
(1)找出在1989年其车辆出过车祸的车主人数;
Select count(distinct ss) from owns,log,accident
where log.license=owns.license and log.driver=accident.driver and year(accident.date)=1989
(2)找出和John Smith的车有关的车祸数量;
Select count(*) from person,owns,license,accident
where person.name=”John Smith” and person.ss=owns.ss
and owns.license=log.license and log.driver=accident.driver (3)为数据库添加一个新客户;
Insert into person values(121,“张三”,“北京海淀区101#”) (4)删除John Smith的马自达车(Mazda);
Delete from Owns where license in
( select license from person,owns,car
Where person.name=” John Smith” and person.ss=owns.ss And owns.licens=car.license and car.model=”Mazda”)
(5)为Jones的丰田车(Toyota)加一条加车祸记录。
Insert into accident (date,driver,damage)
select 2007/10/22, log.driver,”车门损坏” from person,owns,car,log
Where person.name=”Jones” and person.ss=owns.ss And owns.licens=car.license and car.model=” Toyota” And owns.license=log.license
4.2已知关系模式:R=(A,B,C)和S=(D,E,F)以及关系r(R)和s(S)。请给出与下列查询等价的SQL表达式。
(1)?A(r): Select A from r
(2)?B?17(r): select * from r where B=17

