数据库系统原理与应用教程(014)—— 关系数据库练习题(一)
一、简答题
1、试述关系模型的三要素和关系操作语言的特点。
答案:
关系模型的三要素为数据结构、关系操作和完整性约束。在关系模型中,无论是实体集还是实体集之间的联系都是由关系表示的。
关系操作语言的特点:(1)关系操作的方式是一次一集合方式。(2)关系操作语言是高度非过程化的语言。
2、定义并解释下列术语,并说明它们之间的联系和区别。
(1)主码、候选码、外码
答案:
主码和候选码:若关系中的某一个属性(属性组),其值能唯一标识一个元组,则称该属性(或属性组)为候选码。当一个关系有多个候选码时,选定其中的一个候选码为主码。如果关系中只有一个候选码,这个唯一的候选码就是主码。
外码:设 F 是基本关系 R 的一个或一组属性,但不是关系 R 的主码(或候选码),如果 F 与基本关系 S 的主码 KS 相对应,则称 F 是基本关系 R 的外码。
(2)笛卡尔积、关系、元组、属性、域
答案:
笛卡尔积:给定一组域 D1,D2,…,Dn,则域 D1,D2,…,Dn 的笛卡尔积为:
D1×D2×…×Dn={(d1,d2,…,dn) | di ∈ Di,i=1,2,…,n}
关系:域的笛卡尔积所包含的元组是多个域中的元素任意组合得到的,因此有很多元组没有实际意义。从域的笛卡尔积中挑选中有意义的元组构成的集合称为关系。
元组:关系中的一行称为一个元组,组成元组的元素称为分量。
属性:关系中的一列称为一个属性。属性具有型和值,属性的型指属性名和取值范围等,属性的值指属性具体的取值。属性表示实体的特征。
域:域是一组具有相同数据类型的值集合。属性的取值范围称为域。
(3)关系、关系模式、关系数据库
答案:
关系:关系是一张二维表,是从域的笛卡尔积中挑选中有一的元组构成的集合。
关系模式:关系的描述称为关系模式。关系模式可以表示为:R(U,D,Dom,F),其中 R 是关系名,U 为关系包含的属性的集合,D 为属性组 U 中属性的域,Dom 为属性向域的映像的集合,F 为属性间数据依赖的集合。
关系数据库:基于关系模型的数据库称为关系数据库。在关系数据库中,实体与实体之间的联系都是用关系来表示的。其中,一个关系对应一个实体集,关系中的一行对应一个实体,关系中的一列对应实体的一个属性。
3、试述关系模型的完整性规则。在参照完整性中,为什么外码的值可以为空?什么情况下允许为空?
答案:
关系模型有三类完整性:实体完整性,参照完整性和用户自定义完整性。
实体完整性规则:若属性 A 是基本关系 R 的主属性,则属性 A 不能为空值。
参照完整性规则:若属性 F 是基本关系 R 的外码,它与基本关系 S 的主码 Ks 相对应,则对于 R 中每个元组在 F 上的值必须取空值,或者等于 S 中某个元组的主码值。当外码的值不清楚或不确定时,可以设为空值,此时参照关系中没有对应的记录与之匹配。
用户自定义完整性规则:用户自定义的完整性就是针对某一具体应用所定义的约束条件。
4、试述等值连接与自然连接的区别和联系。
答案:等值连接是从关系 R 和 S 的笛卡尔积中选取 R.A 和 S.B 属性值相等的元组。自然连接是一种特殊的等值连接,要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。
5、举例说明参照完整性。
答案:
参照完整性是指参照关系中的外码要从被参照关系的主码中取值。例如,员工是参照关系,部门是被参照关系,部门号是部门表的主码,是员工关系的外码,则员工表的部门号要从部门表的部门号中去取,如下表所示。
部门表:
部门号部门名电话D01销售部3040111D02财务部3040222D03人事部3040333
员工表:
工号姓名性别电话部门E001王刚男3058444D01E002李艳艳女3069777D01E003张静静女3065123D01E004王涛男3086999D02E005张晓刚男3074666D02
6、说明视图与基本表的区别与联系
答案:
基本表是实际存放数据的表。视图表是从一个或几个基本表导出的表,是一个虚拟表。数据库中只存放视图的定义,而不存放视图对应的数据,数据存放在基本表中。视图定义好之后就可以像基本表一样使用,可以对视图进行增、删、改、查。也可以在一个视图之上再定义新的视图,对视图中的数据进行修改其实最终修改的是视图对应的基本表。反之,基本表中的数据发生变化,从视图中查询到的数据也会随之改变。
7、如果某关系的实例满足下列条件之一,要表示该实例,有多少种不同的方法(考虑元组的顺序和属性的顺序)。
(1)3 个属性,3 个元组
(2)4 个属性,5 个元组
(1)m 个属性,n 个元组
答案:
(1)3!× 3!= 36
(2)4!× 5!= 24×120 = 2880
(3)m!× n!
8、针对如下表所示的关系 R 和 S 写出 R ∪ S、R ∩ S 和 R - S。
关系 R:
tNOtNameTELCourse101王明62203546数据结构202张华62209876数据库303赵娟62208076高等数学
关系 S:
tNOtNameTELCourse101王明62203546数据结构102孙俪64309876操作系统103郭德纲63398076计算机网络
答案:
(1)R ∪ S
tNOtNameTELCourse101王明62203546数据结构102孙俪64309876操作系统103郭德纲63398076计算机网络202张华62209876数据库303赵娟62208076高等数学
(2)R ∩ S
tNOtNameTELCourse101王明62203546数据结构
(3)R - S
tNOtNameTELCourse202张华62209876数据库303赵娟62208076高等数学
9、设关系 R 和 S,其值如下表所示,求:
答案:
10、有如下关系:
学生(学号,姓名,年龄,所在系)
选课(课程号,课程名,先行课)
选课(学号,课程号,成绩)
用关系代数完成如下查询:
(1)求学过数据库课程的学生的学号和姓名。
(2)求学过数据库和数据结构的学生的学号和姓名。
(3)求没学过数据库课程的学生的学号。
(4)求学过数据库的先行课的学生的学号。
答案:
/*
create table stu(
stu_id char(11) primary key,
stu_name char(20),
age int,
dept char(20)
);
create table course(
c_id char(5) primary key,
c_name char(20),
Advance_class char(20)
);
create table electives(
stu_id char(11),
c_id char(5),
grade int
);
insert into stu values('20210224101','张宇',20,'管理系');
insert into stu values('20210224102','刘涛',21,'管理系');
insert into stu values('20210224103','刘蓓',20,'经济系');
insert into course values('C0001','高等数学',null);
insert into course values('C0002','计算机基础',null);
insert into course values('C0003','数据库','计算机基础');
insert into course values('C0004','数据结构','计算机基础');
insert into electives values('20210224101','C0001',80),('20210224101','C0002',85),('20210224101','C0003',84),('20210224101','C0004',92);
insert into electives values('20210224102','C0001',80),('20210224102','C0003',80),('20210224102','C0004',90);
insert into electives values('20210224103','C0002',78),('20210224103','C0001',79),('20210224103','C0004',91);
*/
mysql>select*from stu;+-------------+----------+------+-----------+| stu_id | stu_name | age | dept |+-------------+----------+------+-----------+|20210224101| 张宇 |20| 管理系 ||20210224102| 刘涛 |21| 管理系 ||20210224103| 刘蓓 |20| 经济系 |+-------------+----------+------+-----------+3rowsinset(0.03 sec)
mysql>select*from course;+-------+-----------------+-----------------+| c_id | c_name | Advance_class |+-------+-----------------+-----------------+| C0001 | 高等数学 |NULL|| C0002 | 计算机基础 |NULL|| C0003 | 数据库 | 计算机基础 || C0004 | 数据结构 | 计算机基础 |+-------+-----------------+-----------------+4rowsinset(0.00 sec)
mysql>select*from electives;+-------------+-------+-------+| stu_id | c_id | grade |+-------------+-------+-------+|20210224101| C0001 |80||20210224101| C0002 |85||20210224101| C0003 |84||20210224101| C0004 |92||20210224102| C0001 |80||20210224102| C0003 |80||20210224102| C0004 |90||20210224103| C0002 |78||20210224103| C0001 |79||20210224103| C0004 |91|+-------------+-------+-------+10rowsinset(0.00 sec)--(1)求学过数据库课程的学生的学号和姓名。select s.stu_id, stu_name
from stu s,course c,electives e
where s.stu_id = e.stu_id and c.c_id = e.c_id
and c_name ='数据库';--查询结果如下
mysql>select s.stu_id, stu_name
->from stu s,course c,electives e
->where s.stu_id = e.stu_id and c.c_id = e.c_id
->and c_name ='数据库';+-------------+----------+| stu_id | stu_name |+-------------+----------+|20210224101| 张宇 ||20210224102| 刘涛 ||20210224103| 刘蓓 |+-------------+----------+3rowsinset(0.06 sec)--(2)求学过数据库和数据结构的学生的学号和姓名。select s.stu_id, s.stu_name
from(select stu_id
from electives
where c_id =(select c_id from course where c_name ='数据库')) x,
electives e, stu s
where x.stu_id = s.stu_id and x.stu_id = e.stu_id and
e.c_id =(select c_id from course where c_name ='数据结构');--查询结果如下
mysql> mysql>select s.stu_id, s.stu_name
->from(select stu_id
->from electives
->where c_id =(select c_id from course where c_name ='数据库')) x,-> electives e, stu s
->where x.stu_id = s.stu_id and x.stu_id = e.stu_id and-> e.c_id =(select c_id from course where c_name ='数据结构');+-------------+----------+| stu_id | stu_name |+-------------+----------+|20210224101| 张宇 ||20210224102| 刘涛 |+-------------+----------+2rowsinset(0.00 sec)--(3)求没学过数据库课程的学生的学号。select stu_id
from stu
where stu_id notin(select e.stu_id
from course c,electives e
where c.c_id = e.c_id and c_name ='数据库');--查询结果如下
mysql>select stu_id
->from stu
->where stu_id notin->(select e.stu_id
->from course c,electives e
->where c.c_id = e.c_id and c_name ='数据库');
Empty set(0.07 sec)--(4)求学过数据库的先行课的学生的学号。select e.stu_id
from electives e, course c
where e.c_id = c.c_id and
c_name =(select Advance_class from course where c_name ='数据库');--查询结果如下
mysql>select e.stu_id
->from electives e, course c
->where e.c_id = c.c_id and-> c_name =(select Advance_class from course where c_name ='数据库');+-------------+| stu_id |+-------------+|20210224101||20210224103|+-------------+2rowsinset(0.00 sec)
11、设有一个 SPJ 数据库,包括 S、P、J、SPJ 四个关系:
S(SNO,SNAME,STATUS,CITY)–供应商表S,应商表代码SNO,应商表名称SNAME,应商表状态STATUS,应商表所在城市CITY
P(PNO,PNAME,COLOR,WEIGHT)–零件表P,零件代码PNO,零件名称PNAME,颜色COLOR,重量WEIGHT
J(JNO,JNAME,CITY)–工程项目表J,工程项目代码JNO,工程项目名称JNAME,工程项目所在城市CITY
SPJ(SNO,PNO,JNO,QTY)–供应情况表SPJ,供应商代码SNO,零件代码PNO,工程项目代码JNO,供应数量QTY,表示某供应商供应某种零件给某工程项目的数量。
请用关系代码表示如下查询:
(1)求供应工程 J1 零件的供应商号码 SNO
(2)求供应工程 J1 零件 P1 的供应商号码 SNO
(3)求供应工程 J1 零件为红色的供应商号码 SNO
(4)求没有使用天津供应商生产的红色零件的工程号
(5)求至少用了供应商 S1 所供应的全部零件的工程号
答案:
(1)πSNO(σJNO=‘J1’(SPJ))
(2)πSNO(σJNO=‘J1’ ∧ PNO=‘P1’(SPJ))
12、有以下三个关系:
S(S#,SNAME,AGE,SEX,NP)–S(学生),S#(学号),SNAME(姓名),AGE(年龄),SEX(性别),NP(籍贯)
C(C#,CNAME,TEACHER)–C(课程),C#(课程号),CNAME(课程名),TEACHER(主讲教师)
SC(S#,C#,GRADE)–SC(选修),S#(学号),C#(课程号),GRADE(成绩)
请用关系代数表示如下查询:
(1)查询年龄大于 21 岁的男生的学号(S#)和姓名(SNAME)。
(2)查询全部学生都选修的课程的课程号(C#)和课程名(CNAME)。
(3)查询籍贯为上海的学生的学号(S#)、姓名(SNAME)和选修的课程号(C#)。
(4)查询选修了全部课程的学生的姓名(SNAME)和年龄(AGE)。
答案:
13、某医院病房管理信息如下:
科室:科室名称,科室地址,科室电话
病房:病房号,床位号,所属科室名
医生:姓名,职称,所属科室名,年龄,工作证号
病人:病历号,姓名,性别,诊断,主管医生,病房号
其中,一个科室有多个病房、多个医生,一个病房只能属于一个科室,一个医生只属于一个科室,但可负责多个病人的诊治,一个病人的主管医生只有一个。
请完成以下设计:
(1)设计系统的 E-R 图
(2)将该 E-R 图转换为关系模型
(3)指出每个关系的候选码
答案:
(1)E-R 图如下图所示:
(2)E-R 图对应的关系模型如下:
科室(科室名称,科室地址,科室电话)
病房(病房号,床位号,所属科室名)
医生(姓名,职称,所属科室名,年龄,工作证号)
病人(病历号,姓名,性别,诊断,主管医生,病房号)
(3)每个关系的候选码如下:
科室:科室名称
病房:病房号
医生:工作证号
病人:病历号
版权归原作者 睿思达DBA_WGX 所有, 如有侵权,请联系我们删除。