数据库系统原理与应用教程(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 | 销售部 | 3040111 |
D02 | 财务部 | 3040222 |
D03 | 人事部 | 3040333 |
员工表:
工号 | 姓名 | 性别 | 电话 | 部门 |
---|---|---|---|---|
E001 | 王刚 | 男 | 3058444 | D01 |
E002 | 李艳艳 | 女 | 3069777 | D01 |
E003 | 张静静 | 女 | 3065123 | D01 |
E004 | 王涛 | 男 | 3086999 | D02 |
E005 | 张晓刚 | 男 | 3074666 | D02 |
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:
tNO | tName | TEL | Course |
---|---|---|---|
101 | 王明 | 62203546 | 数据结构 |
202 | 张华 | 62209876 | 数据库 |
303 | 赵娟 | 62208076 | 高等数学 |
关系 S:
tNO | tName | TEL | Course |
---|---|---|---|
101 | 王明 | 62203546 | 数据结构 |
102 | 孙俪 | 64309876 | 操作系统 |
103 | 郭德纲 | 63398076 | 计算机网络 |
答案:
(1)R ∪ S
tNO | tName | TEL | Course |
---|---|---|---|
101 | 王明 | 62203546 | 数据结构 |
102 | 孙俪 | 64309876 | 操作系统 |
103 | 郭德纲 | 63398076 | 计算机网络 |
202 | 张华 | 62209876 | 数据库 |
303 | 赵娟 | 62208076 | 高等数学 |
(2)R ∩ S
tNO | tName | TEL | Course |
---|---|---|---|
101 | 王明 | 62203546 | 数据结构 |
(3)R - S
tNO | tName | TEL | Course |
---|---|---|---|
202 | 张华 | 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 | 经济系 |
+-------------+----------+------+-----------+
3 rows in set (0.03 sec)
mysql> select * from course;
+-------+-----------------+-----------------+
| c_id | c_name | Advance_class |
+-------+-----------------+-----------------+
| C0001 | 高等数学 | NULL |
| C0002 | 计算机基础 | NULL |
| C0003 | 数据库 | 计算机基础 |
| C0004 | 数据结构 | 计算机基础 |
+-------+-----------------+-----------------+
4 rows in set (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 |
+-------------+-------+-------+
10 rows in set (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 | 刘蓓 |
+-------------+----------+
3 rows in set (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 | 刘涛 |
+-------------+----------+
2 rows in set (0.00 sec)
--(3)求没学过数据库课程的学生的学号。
select stu_id
from stu
where stu_id not in
(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 not in
-> (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 |
+-------------+
2 rows in set (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)每个关系的候选码如下:
科室:科室名称
病房:病房号
医生:工作证号文章来源:https://www.toymoban.com/news/detail-784326.html
病人:病历号文章来源地址https://www.toymoban.com/news/detail-784326.html
到了这里,关于数据库系统原理与应用教程(014)—— 关系数据库练习题(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!