admin 管理员组

文章数量: 887032


2023年12月19日发(作者:批量修改文件名中的数字)

第2部分 各章习题解答及自测题

第1章 数据库概论

1.1 基本内容分析

1.1.1 本章的重要概念

(1)DB、DBMS和DBS的定义

(2)数据管理技术的发展阶段

人工管理阶段、文件系统阶段、数据库系统阶段和高级数据库技术阶段等各阶段的特点。

(3)数据描述

概念设计、逻辑设计和物理设计等各阶段中数据描述的术语,概念设计中实体间二元联系的描述(1:1,1:N,M:N)。

(4)数据模型

数据模型的定义,两类数据模型,逻辑模型的形式定义,ER模型,层次模型、网状模型、关系模型和面向对象模型的数据结构以及联系的实现方式。

(5)DB的体系结构

三级结构,两级映像,两级数据独立性,体系结构各个层次中记录的联系。

(6)DBMS

DBMS的工作模式、主要功能和模块组成。

(7)DBS

DBS的组成,DBA,DBS的全局结构,DBS结构的分类。

1.1.2本章的重点篇幅

(1)教材P23的图1.24(四种逻辑数据模型的比较)。

(2)教材P25的图1.27(DB的体系结构)。

(3)教材P28的图1.29(DBMS的工作模式)。

(4)教材P33的图1.31(DBS的全局结构)。

1.2 教材中习题1的解答

1.1 名词解释

·逻辑数据:指程序员或用户用以操作的数据形式。

·物理数据:指存储设备上存储的数据。

·联系的元数:与一个联系有关的实体集个数,称为联系的元数。

·1:1联系:如果实体集E1中每个实体至多和实体集E2中的一个实体有联系,反之亦然,那么E1和E2的联系称为“1:1联系”。

·1:N联系:如果实体集E1中每个实体可以与实体集E2中任意个(零个或多个)实体有联系,而E2中每个实体至多和E1中一个实体有联系,那么E1和E2的联系是“1:N联系”。

·M:N联系:如果实体集E1中每个实体可以与实体集E2中任意个(零个或多个)实体有联系,反之亦然,那么E1和E2的联系称为“M:N联系”。

·数据模型:能表示实体类型及实体间联系的模型称为“数据模型”。

·概念数据模型:独立于计算机系统、完全不涉及信息在计算机中的表示、反映企业组织所关心的信息结构的数据模型。

·结构数据模型(或逻辑数据模型):与DBMS有关的,直接面向DB的逻辑结构、从计算机观点对数据建模的数据模型。

·层次模型:用树型(层次)结构表示实体类型及实体间联系的数据模型称为层次模型。

·网状模型:用有向图结构表示实体类型及实体间联系的数据模型称为网状模型。

·关系模型:用二维表格表达实体集的数据模型。

·外模式:是用户用到的那部分数据的描述。

·概念模式:数据库中全部数据的整体逻辑结构的描述。

·内模式:DB在物理存储方面的描述。

·外模式/模式映象:用于定义外模式和概念模式之间数据结构的对应性。

·模式/内模式映象:用于定义概念模式和内模式之间数据结构的对应性。

·数据独立性:应用程序和DB的数据结构之间相互独立,不受影响。

·物理数据独立性:在DB的物理结构改变时,尽量不影响应用程序。

·逻辑数据独立性:在DB的逻辑结构改变时,尽量不影响应用程序。

·主语言:编写应用程序的语言(如C一类高级程序设计语言),称为主语言。

·DDL:定义DB三级结构的语言,称为DDL。

·DML:对DB进行查询和更新操作的语言,称为DML。

·过程性语言:用户编程时,不仅需要指出“做什么”,还需要指出“怎么做”的语言。

·非过程性语言:用户编程时,只需指出“做什么”,不需要指出“怎么做”的语言。

·DD(数据字典):存放三级结构定义的DB,称为DD。

·DD系统:管理DD的软件系统,称为DD系统。

1.2 试解释DB、DBMS和DBS三个概念。

答:DB是长期存储在计算机内、有组织的、统一管理的相关数据的集合。

DBMS是位于用户与OS之间的一层数据管理软件,它为用户或应用程序提供访问DB的方法。

DBS是实现有组织地、动态地存储大量关联数据、方便多用户访问的计算机硬件、软件和数据资源组成的系统,即采用数据库技术的计算机系统。

1.3 人工管理阶段和文件系统阶段的数据管理各有哪些特点?

答:人工管理阶段主要有四个特点:数据不保存在计算机内;没有专用的软件对数据进行管理;只有程序的概念,没有文件的概念;数据面向程序。

文件系统阶段主要有五个特点: 数据以“文件”形式长期保存;数据的逻辑结构与物理结构有了区别;文件组织已多样化;数据面向应用;对数据的操作以记录为单位。

1.4 文件系统阶段的数据管理有些什么缺陷?试举例说明。

答:主要有三个缺陷:数据冗余;数据不一致性;数据联系弱。

例如学校里教务处、财务处、保健处建立的文件中都有学生详细资料,譬如联系电话,家庭住址等。这就是“数据”冗余;如果某个学生搬家,就要修改三个部门文件中的数据,否则会引起同一数据在三个部门中不一致;产生上述问题的原因是这三个部门的文件中数据没有联系。

1.5 数据管理的数据库阶段产生的标志是哪三件事情?

答:进入数据库阶段的标志是20世纪60年代末发生的三件事件:

·1968年IBM公司研制的IMS系统是一个典型的层次DBS;

·1969年美国CODASYL组织DBTG报告,提出网状DBS的概念;

·1970年美国IBM公司的发表论文,提出关系模型的思想。

1.6 数据库阶段的数据管理有哪些特点?

答:主要有五个特点:

采用数据模型表示复杂的数据结构;有较高的数据独立性;为用户提供了方便的用户接口;提供了四个方面的数据控制功能;对数据的操作以数据项为单位,增加了系统的灵活性。

1.7 与“文件”结构相比,“数据库”结构有些什么不同?

答:与文件结构相比,数据库结构主要有下面三点不同:

·数据的结构化。文件由记录组成,但各文件之间缺乏联系。数据库中数据在磁盘中仍以文件形式组织,但这些文件之间有着广泛的联系。数据库的逻辑结构用数据模型来描述,整体结构化。数据模型不仅描述数据本身的特点,还要描述数据之间的联系。

·数据独立性。文件只有设备独立性,而数据库还具有逻辑独立性和物理独立性。

·访问数据的单位。访问文件中的数据,以记录为单位。访问数据库中的数据,以数据项(字段)为单位,增加了系统的灵活性。

1.8 什么是数据独立性?在数据库中有哪两级独立性?

答:数据独立性是指应用程序与DB的数据结构之间相互独立。在物理结构改变时,尽量不影响应用程序,称为物理数据独立性;在逻辑结构改变时,尽量不影响应用程序,称为逻辑数据独立性。

1.9 分布式数据库系统和面向对象数据库系统各有哪些特点?

答:DDBS主要有三个特点:

·数据物理上分布在各地,但逻辑上是一个整体;

·每个场地既可以执行局部应用,也可以执行全局应用;

·各地的计算机由数据通信网络相连接。

面向对象数据系统主要有两个特点:

·面向对象数据模型能完整地描述现实世界的数据结构,能表达数据间嵌套、递归的联系。

·具有面向对象技术的封装性和继承性的特点,提高了软件的可重用性。

1.10 逻辑记录与物理记录,逻辑文件与物理文件有些什么联系和区别?

答:逻辑数据是用户用以操作的数据形式,是抽象的概念化数据。物理数据是实际存放在存储设备上的数据。

逻辑数据与物理数据在结构上可以差别很大,需通过两级映象来进行数据传输和格式转换。

从以上的解释可以看出,逻辑记录和逻辑文件是用户在程序中使用的记录和文件,而物理记录和物理文件是指磁盘上的记录和文件。逻辑记录、文件与物理记录、文件在结构、组成上有很大的差异,而数据管理软件就是通过三级结构两级映象来实现逻辑数据与物理数据之间的转换。

1.11 试述ER模型、层次模型、网状模型、关系模型和面向对象模型的主要特点。

答:ER模型直接表示实体类型及实体间联系,与计算机系统无关,充分反映用户的需求,用户容易理解。

层次模型的数据结构为树结构,记录之间联系通过指针实现,查询较快,但DML属于过程化的,操作复杂。

网状模型的数据结构为有向图,记录之间联系通过指针实现,查询较快,并且容易实现M:N联系,但DML属于过程化的语言,编程较复杂。

关系模型的数据结构为二维表格,容易为初学者理解。记录之间联系通过关键码实现。DML属于非过程化语言,编程较简单。

面向对象模型能完整描述现实世界的数据结构,具有丰富的表达能力,能表达嵌套、递归的数据结构。但涉及的知识面较广,用户较难理解,这种模型尚未普及。

1.12 数据之间联系在各种结构数据模型中是怎么实现的?

答:在层次、网状模型中,数据之间的联系通过指针实现的;

在关系模型中,数据之间联系通过外键和主键间联系实现的;

在面向对象模型中,数据之间嵌套、递归联系通过对象标识符(OID)实现的(见第8章)。

1.13 DB的三级模式结构描述了什么问题?试详细解释。

答:DB的三级模式结构是对数据的三个抽象级别,分别从外部(用户)级、概念级和内部级去观察数据库。

外部级是用户使用的局部数据库的逻辑结构,其描述称为外模式。

概念级是DB的整体逻辑结构,其描述称为概念模式。

内部级是DB的物理结构,其描述称为内模式。

1.14 试述概念模式在数据库结构中的重要地位。

答:数据按外模式的描述提供给用户,按内模式的描述存储在磁盘中,而概念模式提供了连接这两级的相对稳定的中间观点,并使得两级的任何一级的改变都不受另一级的牵制。

1.15 试叙述用户、DB的三级模式结构、磁盘上的物理文件之间有些什么联系和不同?

答:用户、外模式、概念模式、内模式和物理文件中的记录分别称为用户记录、外部记录、概念记录、内部记录和物理记录。

用户记录与外部记录的结构是一致的,它们之间只是数据传输问题。

而外部记录、概念记录和内部记录之间的结构可能是不一致的,除了数据传输问题,还

有格式转换问题。

内部记录与物理记录的结构是一致的,它们之间只是数据传输问题。

1.16 数据独立性与数据联系这两个概念有什么区别?

答:数据独立性是指应用程序和DB的数据之间相互独立,不受影响,对系统的要求是“数据独立性要高”,而数据联系是指记录之间的联系,对系统的要求是“数据联系密切”。

1.17 试述DBMS的工作模式和主要功能。

答:DBMS的工作模式有六点:

·接受应用程序的数据请求和处理请求;

·将用户的数据请求转换成低层指令;

·实现对DB的操作;

·从对DB的操作中接受查询结果;

·对查询结构进行处理;

·将处理结果返回给用户。

DBMS的主要功能有DB的定义、操纵、保护、维护和数据字典等五个功能。

1.18 试叙述DBMS对数据库的维护功能。

答:包括DB的数据载入、转换、转储、DB的改组以及性能监控等功能。这些功能分别由各个实用程序完成。

1.19 从模块结构观察,DBMS由哪些部分组成?

答:DBMS由两大部分组成:查询处理器和存储管理器。(解释略)

1.20 DBS有哪几部分组成?其中DD有什么作用?

答:DBS由DB、硬件、软件和DBA等四个部分组成。(解释略)

在DBS中,DD是存储三级结构描述(即元数据)的DB。DBMS的所有工作都要以DD中的元数据为依据,也就是所有工作都要通过DD访问DB。

1.21“元数据”与“数据”之间有些什么联系与区别?

答:元数据(metadata)是指“数据的数据”,即数据的描述。DB中的元数据是指三级模式结构的详细描述。

数据(data),一般是指用户使用的具体值。

1.22 什么是DBA?DBA应具有什么素质?DBA的职责是什么?

答:DBA是控制数据整体结构的一组人员,负责DBS的正常运行,承担创建、监控和维护DB结构的责任。

DBA必须具备下列4条素质:熟悉企业全部数据的性质和用途;对所有用户的需求有充分的了解;对系统的性能非常熟悉;兼有系统分析员和运筹学专家的品质和知识。

DBA的主要职责有6点:定义模式;定义内模式;与用户的联络;定义安全性规则;定义完整性规则;DB的转储与恢复。

1.23 试对DBS的全局结构作详细解释。

答:从四个方面解释:

·数据库用户有四类:DBA,专业用户,应用程序员,终端用户。

·DBMS的查询处理器有四个模块:DML编译器,嵌入型DML预编译器,DDL编译器,查询运行核心程序。

·DBMS的存储管理器有四个模块:授权和完整性管理器,事务管理器,文件管理器,缓冲区管理器。

·磁盘存储器中有五种数据结构:数据文件,数据字典,索引文件,统计数据组织和日志。

1.24 使用DBS的用户有哪几类?

答:(略,见习题1.23)

1.25 DBMS的查询处理器和存储管理器各有哪些功能?

答:(略,见习题1.23)

1.26 磁盘存储器中有哪五类主要的数据结构?

答:(略,见习题1.23)

1.27 根据计算机的系统结构,DBS可分成哪四种?各有什么特点?

答:根据计算机的系统结构,DBS可分成集中式、C/S式、并行式和分布式等四种

集中式DBS的特点是单点数据(DB集中在一个场地)单地处理(单个CPU)。

C/S式DBS的特点是计算机的功能分放在客户机和服务器上(即功能的分布)。客户机上专门实现前端处理和用户界面。服务器上完成事务处理和数据访问控制。

并行式DBS的特点是使用多个CPU和多个磁盘进行并行操作。

分布式DBS的特点是多点数据(DB分布在多个场地)多点处理(多个CPU)。数据具有物理分布性和逻辑整体性特点。系统中事务有本地事务(访问本地DB)和全局事务(访问至少两个场地的DB)之分。

1.28 DBS能产生哪些效益?

答:DBS的应用,使计算机应用深入到社会的每个角落。其效益有以下7个方面:灵活性,简易性,面向用户,有效的数据控制,加快应用开发速度,维护方便,标准化。

1.3 自测题

1.3.1 填空题

1.数据管理技术的发展,与__________、__________和__________有密切的联系。

2.文件系统中的数据独立性是指__________独立性。

3.文件系统的缺陷是:_________、_________和__________。

4.就信息处理的方式而言,在文件系统阶段,__________处于主导地位,_________只起着服从程序设计需要的作用;而在数据库方式下,_________占据了中心位置。

5.对现实世界进行第一层抽象的模型,称为__________模型;对现实世界进行第二层抽象的模型,称为__________模型。

6.层次模型的数据结构是__________结构;网状模型的数据结构是__________结构;关系模型的数据结构是__________结构;面向对象模型的数据结构之间可以__________。

7.在层次、网状模型中,用__________导航数据;而在关系模型中,用__________导航数据。

8.数据库的三级模式结构是对__________的三个抽象级别。

9.DBMS为应用程序运行时开辟的DB系统缓冲区,主要用于__________和__________。

10.在数据库技术中,编写应用程序的语言仍然是C一类高级语言,这些语言被称为__________语言。

11.在DB的三级模式结构中,数据按__________的描述提供给用户,按__________的描述存储在磁盘中,而

__________提供了连接这两级的相对稳定的中间观点,并使得两级中的任何一级的改变都不受另一级的牵制。

12.层次、网状的DML属于________语言,而关系型DML属于_________语言。

13.DBS中存放三级结构定义的DB称为__________。

14.从模块结构考察,DBMS由两大部分组成:__________和__________。

15.DBA有两个很重要的工具:__________和__________。

16.DBS是________、_________、_________和_________的集合体。

17.DBS的全局结构体现了其__________结构。

18.在DBS中,DB在磁盘上的基本组织形式是_________,这样可以充分利用OS _________的功能。

19.根据计算机的系统结构,DBS可分成四种类型:_______、_______、_______和_______。

20.数据独立性使得修改DB结构时尽量不影响已有的__________。

1.3.2 单项选择题(在备选答案中选出一个正确答案)

1.在DBS中,DBMS和OS之间关系是 [ ]

A.并发运行 B.相互调用

C.OS调用DBMS D.DBMS调用OS

2.在数据库方式下,信息处理中占据中心位置的是 [ ]

A.磁盘 B.程序 C.数据 D.内存

3.DB的三级体系结构是对_________抽象的三个级别。 [ ]

A.存储器 B.数据 C.程序 D. 外存

4.DB的三级模式结构中最接近外部存储器的是 [ ]

A.子模式 B.外模式 C.概念模式 D.内模式

5.DBS具有“数据独立性”特点的原因是因为在DBS中 [ ]

A.采用磁盘作为外存 B.采用三级模式结构

C.使用OS来访问数据 D.用宿主语言编写应用程序

6.在DBS中,“数据独立性”和“数据联系”这两个概念之间联系是 [ ]

A.没有必然的联系 B.同时成立或不成立

C.前者蕴涵后者 D.后者蕴涵前者

7.数据独立性是指 [ ]

A.数据之间相互独立 B.应用程序与DB的结构之间相互独立

C.数据的逻辑结构与物理结构相互独立 D.数据与磁盘之间相互独立

8.DB中数据导航是指 [ ]

A.数据之间联系 B.数据之间指针联系

C.从已知数据找未知数据的过程 D.数据的组合方式

9.用户使用DML语句对数据进行操作,实际上操作的是 [ ]

A.数据库的记录 B.内模式的内部记录

C.外模式的外部记录 D.数据库的内部记录值

10.对DB中数据的操作分成两大类: [ ]

A.查询和更新 B.检索和修改

C.查询和修改 D.插入和修改

1.3.3 问答题

1.试对数据管理技术三个发展阶段作一详细的比较。

2.在用户访问数据库中数据的过程中,DBMS起着什么作用?

3.什么是“DB的系统缓冲区”?

4.DBS中有哪些系统软件?

1.4 自测题答案

1.4.1 填空题答案

1.硬件 软件 计算机应用 2.设备

3.数据冗余 数据不一致 数据联系弱 4.程序设计 数据 数据

5.概念 结构(或逻辑) 6.树 有向图 二维表 嵌套和递归

7.指针 关键码(或外键与主键) 8.数据

9.数据的传输 格式的转换 10.宿主语言(或主语言,host language)

11.外模式 内模式 概念模式 12.过程性 非过程性

13.数据字典(DD) 14.查询处理器 存储管理器

15.一系列实用程序 DD系统 16.数据库 硬件 软件 DBA

17.模块功能 18. 文件 管理外存(或文件系统)

19.集中式 C/S式 并行式 分布式 20.应用程序

1.4.2 单项选择题答案

1.D 2.C 3.B 4.D 5.B

6.A 7.B 8.C 9.C 10. A

1.4.3 问答题答案

1.答:数据管理技术三个发展阶段的详细比较见图1.1。

人工管理阶段

20世纪50年代

汇编语言

科学计算

文件系统阶段

磁盘

数据库阶段

70年代

大容量磁盘

DBMS

企业管理

DBS

面向现实世界

时 间 60年代

环 外存

境 软件

纸带、卡片、磁带

3GL、OS

文件系统

计算机应用

数据的管理者

数据的针对者

数据独立性

数据的结构化

进入企业管理

面向某一应用

独立性差,

用户(程序员)

面向某一应用程序

无独立性,

无结构

数据的共享程度 无共享 共享性差、冗余度大 共享性高、冗余度小

有高度的物理独立性,

整体结构化,

用数据模型描述

数据完全依赖于程序 有设备独立性 一定的逻辑独立性

记录内有结构,

整体结构性差

图1.1

2.答:在用户访问数据的过程中,DBMS起着核心的作用,实现“数据三级结构转换”的工作。

3.答:在应用程序运行时,DBMS在内存为其开辟一个程序工作区,称为“DB的系统缓冲区”。这个工作区主要用于“数据的传输和格式的转换”。

4.答:DBS应包括DBMS、OS、宿主语言和应用开发支撑软件等四部分系统软件。

DBMS是管理DB的软件系统,但对硬盘的管理是由OS实现的,因此DBS中应包括DBMS和OS这两个主要的系统软件。

编写应用程序仍然是用C一类高级程序设计语言,这些语言在DBS中称为宿主语言。

为提高应用程序开发效率,需要像Dephi、PowerBuilder一类软件开发工具(即应用开发支撑软件)开发应用程序。这些软件属于4GL范畴,可使应用系统开发生产率提高20~100倍。

第2章 关系模型和关系运算理论

2.1 基本内容分析

2.1.1 本章重要概念

(1)基本概念

关系模型,关键码(主键和外键),关系的定义和性质,三类完整性规则,ER模型到关系模型的转换规则,过程性语言与非过程性语言。

(2)关系代数

五个基本操作,四个组合操作,七个扩充操作。

(3)关系演算

元组关系演算和域关系演算的原子公式、公式的定义。关系演算的安全性和等价性。

(4)关系代数表达式的优化

关系代数表达式的等价及等价转换规则,启化式优化算法。

(5)关系逻辑

谓词、原子、规则和查询,规则的安全性,用规则模拟关系代数表达式。

2.1.2 本章的重点篇幅

(1)教材中P56的例2.7(关系代数表达式的应用实例)。

(2)教材中P63的例2.19(元组表达式的应用实例)。

(3)教材中P81的例2.36(关系逻辑的规则表示)。

2.1.3 重要内容分析

1.关系代数表达式的运用技巧

(1)一般规则

·对于只涉及到选择、投影、联接的查询可用下列表达式表示:

π…(σ…(R×S)) 或者π…(σ…(R⋈S))

·对于否定的操作,一般要用差操作表示,例如“检索不学C2课的学生姓名”。

·对于检索具有“全部”特征的操作,一般要用除法操作表示,例如“检索学习全部课程的学生姓名”。

(2)“检索不学C2课的学生姓名”,决不能用下式表示:

πSNAME,AGE(σC#≠'C2'(S⋈SC))

一定要用“差”的形式:

πSNAME,AGE(S)-πSNAME,AGE(σC#='C2'(S⋈SC))

(3)“检索学习全部课程的学生学号”,要用πS#,C#(SC)÷πC#(C)表示,

而不能写成 πS#

(SC÷πC#(C))形式。这是因为一个学生学的课程的成绩可能是不一样的。

(4)对于教材P56的例2.7的8个查询语句的关系代数表达式,考生一定要掌握,这是基础。

2.非过程性语言与过程性语言的区别

编程时必须指出“干什么”及“怎么干”的语言,称为过程性语言;编程时只须指出“干什么”,不必指出“怎么干”的语言,称为非过程性语言。

两种语言的主要区别见图2.1。

过程性语言 非过程性语言

编程时,必须指出“怎么干” 编程时,不必指出“怎么干”

由用户进行数据导航 由系统进行数据导航

单记录处理方式

属于3GL范畴

C语言,层次、网状DML等

集合处理方式

属于4GL范畴

关系DML,软件开发工具等

图2.1

2.2 教材中习题2的解答

2.1名词解释

·关系模型:用二维表格表示实体集,外键和主键表示实体间联系的数据模型,称为关系模型。

·关系模式:是对关系的描述,包括模式名、诸属性名、值域名和模式的主键。

·关系实例:关系模式具体的值,称为关系实例。

·属性:即字段或数据项,与二维表中的列对应。属性个数,称为元数(arity)。

·域:属性的取值范围,称为域。

·元组:即记录,与二维表中的行对应。元组个数,称为基数(cardinality)。

·超键:能惟一标识元组的属性或属性集,称为关系的超键。

·候选键:不含有多余属性的超键,称为候选键。

·主键:正在使用的、用于标识元组的候选键,称为主键。

·外键:属性集F是模式S的主键,在模式R中也出现,那么称F是模式R的外键。

·实体完整性规则:实体的主键值不允许是空值。

·参照完整性规则:依赖关系中的外键值或者为空值,或者是相应参照关系中某个主键码。

·过程性语言:编程时必须给出获得结果的操作步骤,即指出“干什么”及“怎么干”的语言。

·非过程性语言:编程时,只需指出需要什么信息,不必给出具体的操作步骤,即只要指出“干什么”,不必指出“怎么干”的语言。

·无限关系:指元组个数为无穷多个的关系。

·无穷验证:验证公式真假时需要进行无限次验证。

2.2 在关系模型中,对关系作了哪些规范性限制?

答:对关系作了一下四个限制:

属性值不可分解;没有重复元组;没有行序;使用时有列序。

2.3 为什么关系中的元组没有先后顺序,且不允许有重复元组?

答:由于关系定义为元组的集合,而集合中的元素是没有顺序的,因此关系中的元组也就没有先后的顺序(对用户而言)。这样既能减少逻辑排序,又便于在关系数据库中引进集合论的理论。

每个关系模式都有一个主键,在关系中主键值是不允许重复的。如果关系中有重复元组,那么其主键值肯定相等,起不了惟一标识作用,因此关系中不允许有重复元组。

2.4 外键值何时允许空?何时不允许空?

答:在依赖表中,当外键是主键的组成部分时,外键值不允许空;否则外键值允许空。

2.5 笛卡儿积、等值联接、自然联接三者之间有什么区别?

答:笛卡尔积是一个基本操作,而等值联接和自然联接是组合操作。

设关系R的元数为r,元组个数为m;关系S的元数为s,元组个数为n。

那么,R×S的元数为r+s,元组个数为m×n;

R⋈S的元数也是r+s,但元组个数小于等于m×n;

R⋈Siθj

的元数小于等于r+s,元组个数也小于等于m×n;

2.6 设有关系R和S:

R

A

3

2

7

4

B

6

5

2

4

C

7

7

3

3

S

A B C

3 4 5

7 2 3

计算R∪S,R-S,R∩S,R×S,π3,2(S),σB<’5’(R),R

2<2

S,

R

S。

解: R∪S A B C R-S A B C R∩S A B C

3 6 7 3 6 7 7 2 3

2 5 7 2 5 7

7 2 3 4 4 3

4 4 3

3 4 5

R×S R.A R.B R.C S.A S.B S.C π3,2(S) C B

3 6 7 3 4 5 5 4

3 6 7 7 2 3 3 2

2 5 7 3 4 5

2 5 7 7 2 3

7 2 3 3 4 5

7 2 3 7 2 3

4 4 3 3 4 5

4 4 3 7 2 3

σB<’5’(R) A B C R⋈S R.A R.B R.C S.A S.B S.C

7 2 3

2<2

7 2 3 3 4 5

4 4 3

R⋈S A B C

7 2 3

2.7 设有关系R和S:

R A B S B C

a b b c

c b e a

d e b d

计算R ⋈ S,R ⋈ S,σA=C(R×S),S ⋉ R。

B

2.8 假设关系U和V分别有m个元组和n个元组,给出下列表达式中可能的最小和最大的元组数量:

⑴ U∩V ⑵ U∪V

⑶ U⋈V ⑷ σF(U)×V (F为某个条件)

⑸ πL(U)-V (其中L为某属性集)

解:

 最小元组 最大元组 操作

数 数

 ⑴ U∩ 0 min(m,n)

V

 ⑵ U∪V

 ⑶ U⋈V

max(m,n)

 0

m+n

m×n

 ⑷σF(U)×V

 ⑸πL(U)-V

 0

 0

m×n

m

2.9 如果R是二元关系,那么下列元组表达式的结果是什么?

{t|( u)(R(t) ∧R(u) ∧(t[1] ≠u[1]∨t[2] ≠u[2]))}

答:当R的元组数≥2时,R中每个元组都存在与之不相同的元组,因此表达式的结果为关系R;

当R的元组数为0或1时,表达式的结果为空关系。

2.10 假设R和S分别是三元和二元关系,试把表达式π1,5(σ2=4∨3=4(R×S))转换成

等价的:①汉语查询句子;②元组表达式;③域表达式。

解:⑴ 在关系R和S的笛卡尔积中,选取第2个属性值与第4个属性值相等,或者第3个属性值与第4个属性值相等的那些元组,再取第1列和第5列组成新的关系。

⑵ 与(R×S)等价的元组表达式是:

{ t | (u) (v) (R(u) ∧ S(v) ∧ t[1]=u[1] ∧ t[2]=u[2] ∧ t[3]=u[3] ∧

t[4]=v[1]∧ t[5]=v[2] )}

与σ2=4 ∨ 3=4(R×S)等价的元组表达式是:

{ t | (u) (v) (R(u) ∧ S(v) ∧ t[1]=u[1] ∧ t[2]=u[2] ∧ t[3]=u[3] ∧

t[4]=v[1]∧ t[5]=v[2] ∧ (t[2]=t[4] ∨ t[3]=t[4]))}

与π1,5(σ2=4 ∨ 3=4(R×S))等价的元组表达式是:

{ w | (t) (u) (v) (R(u) ∧ S(v) ∧ t[1]=u[1] ∧ t[2]=u[2] ∧ t[3]=u[3]

∧t[4]=v[1] ∧ t[5]=v[2] ∧ (t[2]=t[4] ∨ t[3]=t[4]) ∧ w[1]=t[1] ∧w[2]=t[5])}

再对上述元组表达式化简(消去t)可得:

{ w | (u) (v) (R(u) ∧ S(v) ∧ (u[2]=v[1] ∨ u[3]=v[1]) ∧ w[1]=u[1] ∧

w[2]=v[2])}

在熟练后,可以直接写出上式。

⑶ 再转换成域表达式:

{ w1 w2 | (u1) (u2) (u3) (v1) (v2) (R(u1u2u3) ∧ S(v1v2) ∧ (u2=v1 ∨ u3=v1)

∧ w1=u1 ∧ w2=v2)}

再化简(消去u1,v2)可得:

{ w1 w2 | (u2) (u3) (v1) (R(w1u2u3) ∧ S(v1w2) ∧ (u2=v1 ∨ u3=v1))}

2.11 假设R和S都是二元关系,试把元组表达式{t|R(t) ∧(u)(S(u) ∧u[1] ≠t[2])}转换成等价的:

①汉语查询句子; ②域表达式; ③关系代数表达式。

答:①在关系R中选取第2列的值与关系S中某个元组的第1列值不相等的那些元组,组成新的关系。

②域表达式为:

{ t1t2 | R(t1t2)∧(u1) (u2) ( S(u1u2) ∧ u1≠t2)}

③关系代数表达式为:

π1,2(σ2≠3(R×S))或π1,2(R⋈S)

2≠1

R(ba)}转换成等价的:⑴汉语查询句子;⑵关系代2.12 试把域表达式{ ab | R(ab) ∧数表达式;⑶元组表达式。

解:⑴ 在关系R中选取属性值交换后仍是R中元组的那些元组,组成新的关系。

⑵ 关系代数表达式为:π1,2(σ1=4 ∧ 2=3(R×R))

也可写成:R∩π2,1(R)

⑶ 元组表达式为:{ t | (u) (v) (R(u) ∧ R(v) ∧ u[1]=v[2] ∧ u[2]=v[1] ∧

t[1]=u[1] ∧ t[2]=u[2])}

或:{ t | (v) (R(t) ∧ R(v) ∧ t[1]=v[2] ∧ t[2]=v[1])}

2.13 有两个关系R (A, B, C)和是S(D, E, F),试把下列关系代数表达式转换成等价的元组表达式:

①πA(R); ②σB=’17’(R);

R×S; ④πA,F(σC=D(R×S)

解:①πA(R):{ t | (u) ( R(u) ∧ t[1]=u[1])}

②σB='17'(R):{ t | R(t) ∧ t[2]=

'17'}

③ R×S:{ t | (u) (v) ( R(u) ∧ S(v) ∧ t[1]=u[1] ∧ t[2]=u[2] ∧t[3]=u[3]

∧ t[4]=v[1] ∧t[5]=v[2] ∧t[6]=v[3])}

④πA,F(σC=D(R×S)):{ t | (u) (v) ( R(u) ∧ S(v) ∧ u[3]=v[1] ∧ t[1]=u[1]

∧ t[2]=v[3])}

2.14 设有关系R(A,B,C)和S(A,B,C),试把下列关系代数表达式转换成等价的域表达式:

① πA(R) ② σ2=′17′(R)

③ R∪S

⑤ R-S

④ R∩S

⑥ π1,2(R) π2,3(S)

解:① πA(R): { t1 | (u2) (u3) ( R(t1u2u3))}

② σ2=′17′(R): { t1t2t3 | R(t1t2t3) ∧ t2=

'17'}

③ R∪S:{ t1t2t3 | R(t1t2t3) ∨ S(t1t2t3)}

④ R∩S:{ t1t2t3 | R(t1t2t3) ∧ S(t1t2t3)}

⑤ R-S:{ t1t2t3 | R(t1t2t3) ∧┓ S(t1t2t3)}

⑥ π1,2(R:{ t1t2t3 | (u3) (v1) | R(t1t2u3) ∧ S(v1t2t3)}

) π2,3(S)2.15 设有关系R(A,B)和S(A,C),试把下列域表达式转换成等价的关系代数表达式:

 ① {a |(b)(R(ab)∧ b=17)}

② {abc |(R(ab)∧ S(ac))}

③ {a |(b)(R(ab))∨(c)((d)(S(dc))⇒S(ac))}

④ {a |(c)(S(ac)∧(b1)(b2)(R(ab1)∧R(cb2)∧b1>b2))}

解:① π1(σ2=′17′(R))

② R⋈S

③ π1(R)∪(S÷π2(S))

④ π1(σ1=3 ∧ 2=5 ∧ 4>6(S×R×R))

2.16 设两个关系R (A,B )和S (A,C )。用null表示空值,分别写出等价于下列表达式的元组关系演算表达式:

① R S;② R S; ③ R S 。

解:① R S:

{ t | (u) (v) (R(u) ∧ S(v) ∧ u[1]=v[1] ∧ t[1]=u[1] ∧t[2]=u[2] ∧

t[3]=v[2])

∨ (v) (u) (S(v) ∧ R(u) ∧ v[1]≠u[1] ∧ t[1]=null ∧t[2]=v[1] ∧

t[3]=v[2])}

② R S:

{ t | (u) (v) (R(u) ∧ S(v) ∧ u[1]=v[1] ∧ t[1]=u[1] ∧t[2]=u[2] ∧

t[3]=v[2])

∨ (u) (v) (R(u) ∧ S(v) ∧ u[1]≠v[1] ∧ t[1]=u[1] ∧t[2]=u[2] ∧

t[3]=null)

∨ (v) (u) (S(v) ∧ R(u) ∧ v[1]≠u[1] ∧ t[1]=null ∧t[2]=v[1] ∧

t[3]=v[2])}

③ R S:

{ t | (u) (v) (R(u) ∧ S(v) ∧ u[1]=v[1] ∧ t[1]=u[1] ∧t[2]=u[2] ∧

t[3]=v[2])

∨ (u) (v) (R(u) ∧ S(v) ∧ u[1]≠v[1] ∧ t[1]=u[1] ∧t[2]=u[2] ∧

t[3]=null)

2.17 设有三个关系:

S(S#,SNAME,AGE,SEX)

SC(S#,C#,CNAME)

C(C#,CNAME,TEACHER)

试用关系代数表达式表示下列查询语句:

① 检索LIU老师所授课程的课程号和课程名。

② 检索年龄大于23岁的男学生的学号和姓名。

③ 检索学号为S3学生所学课程的课程名与任课教师名。

④ 检索至少选修LIU老师所授课程中一门课的女学生姓名。

⑤ 检索WANG同学不学的课程的课程号。

⑥ 检索至少选修两门课的学生学号。

⑦ 检索全部学生都选修的课程的课程号与课程名。

⑧ 检索选修课程包含LIU老师所授全部课程的学生学号。

解:⑴ πC#,CNAME(σTNAME='LIU'(C))

⑵ πS#,SNAME(σAGE>'23' ∧ SEX='M'(SC))

⑶ πCNAME,TNAME(σS#='S3'(SC⋈C))

⑷ πSNAME(σSEX='F' ∧ TNAME='LIU'(S⋈SC⋈C))

⑸ πC#(C)-πC#(σSNAME='WANG'(S⋈SC))

⑹ π1(σ1=4 ∧ 2≠5(SC×SC))

⑺ πC#,CNAME(C⋈(πS#,C#(SC)÷πS#(S)))

⑻ πS#,C#(SC)÷πC#(σTNAME='LIU'(C))

2.18 试用元组表达式表示第2.17题中各个查询语句。

解:⑴ { t | (u) (C(u) ∧ u[3]='LIU' ∧ t[1]=u[1] ∧ t[2]=u[2])}

⑵ { t | (u) (S(u) ∧ u[3]>23 ∧ u[4]='M' ∧ t[1]=u[1] ∧ t[2]=u[2])}

⑶ { t | (u) (v) (SC(u) ∧ C(v) ∧ u[1]='S3' ∧ u[2]=v[1] ∧ t[1]=v[2] ∧t[2]=v[3])}

(此处自然联接条件u[2]=v[1]不要遗漏)

⑷ { t | (u) (v) (w) (S(u) ∧ SC(v) ∧ C(w) ∧ w[3]='LIU' ∧ u[4]='F' ∧u[1]=v[1] ∧ v[2]=w[1] ∧ t[1]=u[2])}

(此处自然联接条件u[1]=v[1]和v[2]=w[1]不要遗漏)

⑸ { t | (u) (v) (w) (C(u) ∧ S(v) ∧ SC(w) ∧ v[2]='WANG' ∧

(w[1]=v[1] => w[2]≠u[1]) ∧ t[1]=u[1])}

其意思是:在关系C中存在一门课程,在关系S中存在一个WANG同学,在关系SC中要求不存在WANG同学学这门课程的元组。也就是要求在关系SC中,WANG同学学的课程都不是这门课程(因此在元组表达式中要求全称量词

)。

⑹ { t | (u) (v) (SC(u) ∧ SC(v) ∧ u[1]=v[1] ∧ u[2]≠v[2] ∧ t[1]=u[1])}

⑺ { t | (u) (v) (w) (C(u) ∧ S(v) ∧ SC(w) ∧ w[2]=u[1] ∧ w[1]=v[1] ∧t[1]=u[1] ∧ t[2]=u[2])}

其意思是:在关系C中找一课程号,对于关系S中每一个学生,都应该学这门课(即在关系SC中存在这个学生选修这门课的元组)。

⑻ { t | (u) (SC(u) ∧ (v) (C(v)

∧(v[3]='LIU' => (w) (SC(w) ∧ w[1]=u[1] ∧ w[2]=v[1])))∧

t[1]=u[1])}

其意思是:在关系SC中找一个学号,对于关系C中LIU老师的每一门课,这个学生都学了(即在关系SC中存在这个学生选修这门课的元组)。

由于在括号中出现“=>”符号(包含有“∨”的语义),因此括号中的量词(w)就不能随意往左边提了。

2.19 试用域表达式表示第2.17题的各个查询语句。

解:① { t1 t2 | (u1 u2 u3) (C(u1 u2 u3) ∧ u3='LIU' ∧ t1=u1

∧ t2=u2)}

再简化成:{ t1 t2 | C(t1 t2 'LIU')}

此处(u1 u2 u3)是(u1) (u2) (u3) 的简写,下同。

② { t1 t2 | (u1 u2 u3 u4) (S(u1 u2 u3 u4) ∧ u3>'23' ∧ u4='M' ∧ t1=u1∧ t2=u2)}

再简化成:{ t1 t2 | (u3) (S(t1 t2 u3 'M') ∧ u3>'23')}(以下各题的化简略)

③ { t1 t2 | (u1 u2 u3) (v1 v2 v3) (SC(u1 u2 u3) ∧ C(v1 v2 v3) ∧ u1='s3' ∧ u2=

v1

∧ t1=v2

∧ t2=v3)}

④ { t1 | (u1 u2 u3 u4) (v1 v2 v3) (w1 w2 w3) (S(u1 u2 u3 u4) ∧ SC(v1 v2 v3)

∧ C(w1 w2 w3) ∧w3='LIU' ∧ u4='F' ∧ u1=v1

∧ v2=w1

∧ t2=u2)}

(⑤~⑧题的域表达式,读者可以很容易写出,此处略)

2.20 设关系R和S的属性集相同,W是R的属性集的子集,试说明下列等式是否成立,并指出它们的正确表示:

① πW(R-S) =πW(R)-πW(S)

② πW(R∩S) =πW(R)∩πW(S)

③ πW(R∪S) =πW(R)∪πW(S)

答:① πW(R-S) =πW(R)-πW(S)是一个错误的式子。

譬如R只有一个元组(1,2,3),S只有一个元组(1,2,4),W为R、S中前两个属性。显然R和S不满足上式。正确的式子应该是πW(R-S) =πW(R)-S。

② πW(R∩S) =πW(R)∩πW(S)是一个错误的式子。

譬如R只有一个元组(1,2,3),S只有一个元组(1,2,4),W为R、S中前两个属性。显然R和S不满足上式。此时不可以把π操作往里移。

③ πW(R∪S) =πW(R)∪πW(S)是一个正确的式子。

2.21 在教学数据库的关系S、SC、C中,用户有一查询语句:检索女同学选修课程的课程名和任课教师名。

① 试写出该查询的关系代数表达式。

② 画出查询表达式的语法树。

③ 使用启发式优化算法,对语法树进行优化,并画出优化后的语法树。

解:① 关系代数表达式为:

πCNAME,TEACHER(σSEX=’F’(S⋈SC⋈C))

②上述关系代数表达式的语法树如图2.2所示。

π

CNAME,TEACHE

σ

SEX=’F’

C

S SC

图2.2

③ 上述的关系代数表达式为:

πCNAME,TEACHER(σSEX=’F’(πL(σS.S#=SC.S# ∧ SC.C#=C.C#((S×SC)×C))))

此处L为S、SC、C中全部属性(公共属性只取一次)。

设L1=πS#(σSEX='F'(S))

L2=πS#,C#(SC)

则优化的关系代数表达式为:

πCNAME,TEACHER(σSC.C#=C.C#(πSC.C#(σS.S#=SC.S#(L1×L2))×C))

优化后的语法树如图2.3所示。

π

CNAME,TEACHER

σ

SC.C#=C.C#

×

C

π

SC.C#

σ

S.S#=SC.S#

×

图2.3

2.22 为什么要对关系代数表达式进行优化?有哪三条启发式规则?对优化起什么作用?

答:关系代数表达式由关系代数操作组合而成。操作中,以笛卡尔积和联接操作最费时,并生成大量的中间结果。如果直接按表达式书写的顺序执行,必将花费很多时间,并生成大量的中间结果,效率较低。在执行前,由DBMS的查询子系统先对关系代数表达式进行优化,尽可能先执行选择和投影操作,以便减少中间结果,并节省时间。

优化工作是由DBMS做的,用户书写时不必关心优化一事,仍以简练的形式书写。

三条启发式规则是:尽可能早执行选择操作;尽可能早执行投影操作;把笛卡尔积与附近的一连串选择和投影合并起来做。

使用这三条规则,可以使计算时尽可能减少中间关系的数据量。

2.23 试解释关系逻辑中的名词:

·谓词:在关系逻辑中,每一个谓词符号表示了一个关系,但在规则中谓词符号类似于关系演算中的公式。

·外延谓词:其关系存储在数据库中的谓词称为“外延谓词”。

·内涵谓词:由逻辑规则定义的谓词称为“内涵谓词”。

·外延数据库:用“外延数据库”的缩写EDB来引用外延谓词或相应关系。

·内涵数据库:用“内涵数据库”的缩写IDB来引用内涵谓词或相应关系。

·原子:关系逻辑中的基本成分,称为原子。原子有关系原子和算术原子两种。

·关系原子:关系原子是一个谓词符号,带一个参数表,每个参数可以是变量或常量。用大写字母表示谓词符号,用小写字母表示变量,常量用引号括起来。

·算术原子:算术原子是算术比较表达式。

·规则:规则是形为W←P1∧P2∧…∧Pn的式子,规则有三部分组成:

① 一个称为头部(head)的关系原子;

② 符号“←”,通常读作“if”;

③ 包括一个或多个原子的体(body),称为子目标(subgoal),它可能是关系原子,也可能是算术原子。各子目标用“与”运算符 ∧ 连接,并且子目标前面可以有“非”运算符┐,也可以没有。

·查询:关系逻辑中的查询是一个或多个规则的聚集,规则之间的顺序无关紧要。

2.24 假设R(A,B,C),S(A,B,C)和T(A,B,C)为三个关系。试对下列关系代数表达式写出关系逻辑的规则或规则集:

① R∪S ② R∩S ③ R-S ④(R∪S)-T

⑤(R-S)∩(R-T) ⑥ πa,b(R)

解: ① R∪S:W(a,b,c)←R(a,b,c)

W(a,b,c)←S(a,b,c)

② R∩S: W(a,b,c)←R(a,b,c) ∧ S(a,b,c)

③ R-S: W(a,b,c)←R(a,b,c) ∧┐ S(a,b,c)

④(R∪S)-T: W(a,b,c)←R(a,b,c) ∧┐ T(a,b,c)

W(a,b,c)←S(a,b,c) ∧┐ T(a,b,c)

⑤(R-S)∩(R-T): W(a,b,c)←R(a,b,c) ∧┐ S(a,b,c) ∧┐ T(a,b,c)

⑥ πa,b(R): W(a,b)←R(a,b,c)

2.25 假设R(X,Y,Z)为一个关系,试写出下列关系代数表达式σF(R)的关系逻辑规则。其中F为以下条件:

① x = y ② x

④ ┐(xy) ⑤ ┐((xy) ∧ y

⑥ ┐((x

解: ① F为x = y,此时关系选择规则为:

W(x,y,z)←R(x,y,z) ∧ x=y

② F为x

W(x,y,z)←R(x,y,z) ∧x

③ F为x

W(x,y,z)←R(x,y,z) ∧x

W(x,y,z)←R(x,y,z) ∧y

④ F为┐(xy),即x≥y ∧ x≤y,也就是x=y,此时关系选择规则为:

W(x,y,z)←R(x,y,z) ∧ x=y

⑤ F为┐((xy) ∧ y

W(x,y,z)←R(x,y,z) ∧ x=y

W(x,y,z)←R(x,y,z) ∧ y≥z

⑥ F为┐((x

W(x,y,z)←R(x,y,z) ∧ x≥y ∧ x≥z

W(x,y,z)←R(x,y,z) ∧ y≥z

2.26 假设R(A,B,C),S(B,C,D)和T(D,E)为三个关系。对每个自然联接写出单一的规则:

① R S ② S T ③ (R S) T

解: ① R S:

W(a,b,c,d)← R(a,b,c)∧ S(b,c,d)

② S T:

W(b,c,d,e)← R(b,c,d)∧ S(d,e)

③ (R S) T

W(a,b,c,d,e)← R(a,b,c)∧ S(b,c,d)∧ T(d,e)

2.27 对下列每个规则,写出关系代数表达式来定义与规则头部相同的关系:

① W(x,y)← Q(x,z)∧ R(z,y)

② W(x,y)← Q(x,z)∧ Q(z,y)

③ W(x,y)← Q(x,z)∧ R(z,y)∧ x

解: ①π1,4(σ2=3(Q×R))

②π1,4(σ2=3(Q×Q))

③π1,4(σ2=3∧ 1<4(Q×R))

2.28 试用关系逻辑的规则来定义第2.17题的各个查询语句。

解: ① 检索LIU老师所授课程的课程号和课程名。

W(a,b)← C(a,b,'LIU')

② 检索年龄大于23岁的男学生的学号和姓名。

W(a,b)← S(a,b,h,'M')∧ h>23

③ 检索学号为S3学生所学课程的课程名与任课教师名。

W(a,b)← SC('S3',e,f)∧ C(e,a,b)

④ 检索至少选修LIU老师所授课程中一门课的女学生姓名。

W(f)← S(e,f,g,'F')∧ SC(e,h,i)∧ C(h,j,'LIU')

⑤ 检索WANG同学不学的课程的课程号。

W(a)← C(a,b,d)∧ S(e,'WANG',f,g)∧ ┐SC(e,a,h)

⑥ 检索至少选修两门课的学生学号。

W(a)← SC(a,e,f)∧ SC(a,g,h)∧ e≠g

⑦ 检索全部学生都选修的课程的课程号与课程名。

W(a,b)← C(a,b,e)∧ ┐S(f,g,h,i)∧ ┐SC(f,a,j)

⑧ 检索选修课程包含LIU老师所授全部课程的学生学号。

W(a)← SC(a,b,e)∧ ┐C(f,g,'LIU')∧ ┐SC(a,f,h)

2.29 试撰写短文,对关系运算的三种形式作一评估。

答:短文应提到以下几点:

(1)三种关系运算的理论基础。

(2)三种关系运算的等价性。

关系代数和关系演算在关系代数的五个基本操作的基础上是等价的。

关系代数和关系逻辑在表达功能方面不相适应,每个都能表达另一个不能表达的内容。在作了严格的限制后,才能等价。但关系逻辑比关系代数更富于表现力。

(3)三种关系运算非过程性的强弱不一样。

2.3 自测题

2.3.1 填空题

1.关系中没有行序的原因是___________。

2.

3.关系模型的基本数据结构是___________,其数据库存储时的基本组织方式是___________。

4.实体完整性规则是对___________的约束,参照完整性规则是对___________的约束。

5.关系代数的理论基础是___________,关系演算的理论基础是___________,关系逻辑的理论基础是___________。

6.关系代数的基本操作是___________。

7.安全运算是指不产生___________和___________的运算。

8.等式R S = R×S成立的条件是___________。

9.关系的并、差、交操作,要求两个关系具有___________。

10.一般,在关系代数运算中,当查询涉及到“否定”时,就要用到___________操作;当查询涉及到“全部值”时,就要用到___________操作。

11.如果关系R和S做自然联接时,只把R中原该舍去的元组放到新关系中,那么这种操作称为___________操作。

12.等式πL(σF(E))=σF(πL(E))成立的条件是___________。

13.等式πL1(πL2(E))=πL1(E)成立的条件是___________。

14.等式σF(E1×E2)= E1×σF(E2)成立的条件是___________。

15.等式σF(E1⋈E2)= σF(E1)⋈σF(E2)成立的条件是___________。

16.关系逻辑中,外延谓词是指_______________,内涵谓词是指_______________。

17.关系逻辑中的“安全条件”是指____________________。

18.设有关系R(A,B,C),那么与规则W(c,a)← R(a,b,c)

等价的关系代数操作是____________。

19.设有关系R(A,B,C),那么与规则W(a,b)← R(a,b,'18')∧b≥'15'

等价的关系代数操作是____________。

20.设有关系R(A,B,C)和S(B,C,D),那么与规则

W(a,d)← R(a,b,c)∧ S(b,c,d)

等价的关系代数操作是____________。

2.3.2 单项选择题(在备选答案中选出一个正确答案)

1.在关系中,“元数”(arity)是指 [ ]

A.行数 B.元组个数 C.关系个数 D.列数

2.在关系中,“基数”(cardinality)是指 [ ]

A.行数 B.属性个数 C.关系个数 D.列数

3.由系统进行数据导航的语言称为 [ ]

A.第三代语言 B.高级程序设计语言

C.过程性语言 D.非过程性语言

4.设关系R、S、W各有10个元组,那么这三个关系的自然联接的元组个数为 [ ]

A.10 B.30 C.1000 D.不确定(与计算结果有关)

5.设W = R S,且W、R、S的元组个数分别为p、m、n,那么三者之间满足 [ ]

iθj

A.p<(m+n) B.p≤(m+n) C.p<(m×n) D.p≤(m×n)

6.设关系R和S的结构相同,且各有10个元组,那么这两个关系的并操作结果的元组个数为 [ ]

A.10 B.小于等于10 C.20 D.小于等于20

7.设关系R和S的属性个数分别为2和3,那么 R S等价于 [ ]

1<2

A.σ1<2(R×S)

C.σ1<2(R S)

B.σ1<4(R×S)

D.σ1<4(R S)

8.如果两个关系没有公共属性,那么其自然联接操作 [ ]

A.转化为笛卡尔积操作 B.转化为联接操作

C.转化为外部并操作 D.结果为空关系

9.下列式子中,不正确的是 [ ]

A.R-S=R-(R∩S) B.R=(R-S)∪(R∩S)

C.R∩S=S-(S-R) D.R∩S=S-(R-S)

10.设关系R和S都是二元关系,那么与元组表达式

{ t | (u) (v) (R(u) ∧ S(v) ∧ u[1]=v[1] ∧ t[1]=v[1] ∧ t[2]=v[2])}

等价的关系代数表达式是 [ ]

A.π3,4(R⋈S) B.π2,3(R⋈S)

C.π3,4(R⋈S) D.π3,4(σ1=1(R×S))

1=3

11.在元组关系演算中,与公式P1∧P2等价的公式是 [ ]1=1

A.┐(P1∨P2) B.┐P1∨┐P2

C.┐(┐P1∧┐P2) D.┐(┐P1∨┐P2)

12.在元组关系演算中,与公式(s)(P1(s))等价的公式是 [ ]

A.┐(s)(P1(s)) B.(s)(┐P1(s))

C.┐(s)(┐P1(s)) D.┐(s)(┐P1(s))

13.在元组关系演算中,与公式P1=>P2等价的公式是 [ ]

A.┐P1∨P2 B.┐P2∨P1

C.┐P1∧P2 D.┐P2∧P2

14.与域演算表达式{ab | R(ab)∧ R(ba)}不等价的关系代数表达式是 [ ]

A.π1,2(σ1=4∧2=3(R×R)) B.π1,2(R ⋈ R)

C.R∩π2,1(R) D.σ1=2(R)

∧2=1 1=215.设R和S都是二元关系,那么与元组演算表达式

{ t | (u) (v) (R(u)∧S(v)∧u[2]=v[2]∧t[1]=u[1]∧t[2]=v[1])}

等价的关系代数表达式是 [ ]

A.π1,3(σ2=4(R⋈S)) B.π1,3(σ2=2(R×S))

C.π1,3(R ⋈S) D.π1,3(R ⋈S)

16.设有关系R(R⋈S等价的关系代数表达式是

2=A4

,B,C)和S(B,C,D),那么与2=2

[ ]

A.σ3=5(R⋈S) B.π1,2,3,6(σ3=5(R ⋈ S))

C.σ3=5∧2=4(R×S)) D.π1,2,3,6(σ3=2∧2=1(R×S))

2=1 2=1

17.设R和S都是二元关系,那么与元组演算表达式

{ t | R(t)∧ (u) (S(u) ∧ u[1]≠ t[2])}

不等价的关系代数表达式是 [ ]

A.π1,2(σ2≠3(R×S)) B.π1,2(σ2≠1(R×S))

C.π1,2(R ⋈S) D.π3,4(σ1≠4(S×R))

18.在关系代数表达式的查询优化中,不正确的叙述是 [ ]

2≠1

A.尽可能早地执行联接

B.尽可能早地执行选择

C.尽可能早地执行投影

D.把笛卡尔积和随后的选择合并成联接运算

2.3.3 计算题

1.设有关系R和S:

R A B C S B C D

6 4 2 4 4 9

6 5 3 4 2 5

5 6 8 5 2 6

5 3 8

6 8 4

试计算:R⋈S,R⋈S,R⋈S,R⋈S。

2.设有关系R和S:

2=1 3=2 1>3

R A B C S D E F

2 4 6 3 6 9

3 2 1 3 4 5

7 4 4 4 4 7

试计算下面四个元组表达式的值:

R1={ t | R(t)∧ t[2]<3 }

R2={ t | (u) (R(t) ∧ S(u) ∧ t[1]

R3={ t | (u) (R(t) ∧ S(u) ∧ t[3]

R4={ t | (u)(v)(R(u) ∧ S(v) ∧ u[2]=v[2] ∧ t[1]=u[1] ∧ t[2]=v[3])}

3.在第2题的关系R和S中,试计算下面四个域表达式的值:

R1={ xyz | (u)(v)(R(xyz)∧ S(uzv)) }

R2={ xy | (u) (v)(w) (R(uxv) ∧ S(uwy) ∧ v>w )}

R3={ xyz | (u)(v) (R(xyz) ∧ S(uyv) ∧ x

R4={ xyz | (u)(v)(w)(R(xyu) ∧ S(vwz) ∧ u=w)}

4. 在第2题的关系R和S中,试计算下面四个规则的值:

规则1:W1(b)← R(a,b,c)∧ a>c

规则2:W2(a,b,c,d,f)← R(a,b,c)∧ S(d,b,f)

规则3:W3(a,b,c)← R(a,b,c)∧ S(d,e,f)∧ b>d

规则4:W4(a,b,c)← R(a,b,c)∧ ┐S(c,e,f)

2.4 自测题答案

2.4.1 填空题答案

1.关系被定义为一个集合 2.关系中主键值不允许重复

3.关系(或二维表) 文件 4.主键 外键 5.集合论(或集合代数) 谓词演算

6.∪、-、×、π和σ 7.无限关系 无穷验证

8.R和S没有公共属性 9.相同的关系模式(或相同的结构) 10.差

除法 11.左外联接 12.条件F只涉及到L中的属性 13.L1⊆L2

14.F只涉及到E2中的属性 15.F只涉及E1和E2中的公共属性

16.其关系存储在数据库中的谓词 由逻辑规则定义的谓词

17.出现在规则中任何地方的变量必须出现在某个非求反的关系子目标中

18.W=πC,A(R) 19.W=πA,B(σB≥'15'∧C='18'(R))

20.W=π1,4(R⋈S) 或 W=π1,6(σ2=4∧3=5(R×S))

2.4.2 单项选择题答案

1.D 2.A 3.D 4.D 5.D

6.D 7.B 8.A 9.D 10.C

11.D 12.D 13.A 14.D 15.D

16.B 17.B 18.A

2.4.3 计算题答案

1.答:

R⋈S A B C D R⋈S A R.B R.C S.B S.C D

2=1

6 4 2 5 6 4 2 4 4 9

6 5 3 8 6 4 2 4 2 5

5 6 8 4 6 5 3 5 2 6

6 5 3 5 3 8

5 6 8 6 8 4

R⋈S A R.B R.C S.B S.C D

3=2

6 4 2 4 2 5

6 4 2 5 2 6

6 5 3 5 3 8

5 6 8 6 8 4

R⋈S A R.B R.C S.B S.C D

1>3

6 4 2 4 2 5

6 4 2 6 8 4

6 5 3 4 2 5

6 5 3 6 8 4

5 6 8 6 8 4

2.答:

R1 A B C

3 2 1

3.答:

R1 A B C

2 4 6

7 4 4

4.答:

W1 R.A R.B R.C

3 2 1

7 4 4

W3 R.A R.B R.C

2 4 6

7 4 4

R2 A B C R3 A B C R4 A F

2 4 6 3 2 1 2 5

3 2 1 7 4 4 2 7

7 5

7 7

R2 B F R3 A B C R4 A B F

4 5 2 4 6 2 4 9

4 7 3 2 1 7 4 5

7 4 7

W2 R.A R.B R.C S.D S.F

2 4 6 3 5

2 4 6 4 7

7 4 4 3 5

7 4 4 3 7

W4 R.A R.B R.C

2 4 6

3 2 1

第3章 关系数据库语言SQL

3.1 基本内容分析

3.1.1 本章重要概念

(1)SQL数据库的体系结构,SQL的组成。

(2)SQL的数据定义:SQL模式、基本表和索引的创建和撤销。

(3)SQL的数据查询;SELECT语句的句法,SELECT语句的三种形式及各种限定,基本表的联接操作,SQL3中的递归查询。

(4)SQL的数据更新:插入、删除和修改语句。

(5)视图的创建和撤消,对视图更新操作的限制。

(6)嵌入式SQL:预处理方式,使用规定,使用技术,卷游标,动态SQL语句。

3.1.2 本章的重点篇幅

(1)教材中P97的例3.8(SELECT语句)。

(2)教材中P123的例3.31和P123的例3.32(嵌入式SQL)。

3.1.3 重要内容分析

SELECT语句是SQL的核心内容,对于该语句考生应掌握下列内容。

1.SELECT语句的来历

在关系代数中最常用的式子是下列表达式:

πA1,…,An(σF(R1×…×Rm))

这里R1、…、Rm为关系,F是公式,A1、…、An为属性。

针对上述表达式,SQL为此设计了SELECT—FROM—WHERE句型:

SELECT A1,…,An

FROM R1,…,Rm

WHERE F

这个句型是从关系代数表达式演变来的,但WHERE子句中的条件表达式F要比关系代数中公式更灵活。

2.SELECT语句中出现的基本表名,应理解为基本表中的元组变量,而列名应理解为元组分量。

3.SELECT语句的语义有三种情况,下面以学生表S(S#,SNAME,AGE,SEX)为例说明。

第一种情况:SELECT语句中未使用分组子句,也未使用聚合操作,那么SELECT子句的语义是对查询的结果执行投影操作。譬如:

SELECT S#,SNAME

FROM S

WHERE SEX='M';

第二种情况:SELECT语句中未使用分组子句,但在SELECT子句中使用了聚合操作,此时SELECT子句的语义是对查询结果执行聚合操作。譬如:

SELECT COUNT(*),AVG(AGE)

FROM S

WHERE SEX='M';

该语句是求男同学的人数和平均年龄。

第三种情况:SELECT语句使用了分组子句和聚合操作(有分组子句时必有聚合操作),此时SELECT子句的语义是对查询结果的每一分组去做聚合操作。譬如:

SELECT AGE,COUNT(*)

FROM S

WHERE SEX='M'

GROUP BY AGE;

该语句是求男同学每一年龄的人数。

4.SELECT语句中使用分组子句的先决条件是要有聚合操作。但执行聚合操作不一定要用分组子句。譬如求男同学的人数,此时聚合值只有一个,因此不必分组。

但同一个聚合操作的值有多个时,必须使用分组子句。譬如求每一年龄的学生人数。此时聚合值有多个,与年龄有关,因此必须分组。

3.2 教材中习题3的解答

3.1 名词解释

·基本表:实际存储在数据库中的表,称为基本表。

·视图:是从基本表或其他视图中导出的表,它本身不独立存储在数据库中,也就是数据库中只存放视图的定义而不存放视图的数据。

·实表:是对基本表的别称。

·虚表:是对视图的别称。

·相关子查询:SELECT语句嵌套时,子查询中查询条件依赖于外层查询中的值,因此子查询要反复求值供外层查询使用。这种子查询称为相关子查询。

·联接查询:查询时要从多个基本表中提取数据,此时把多个基本表写在同一层的FROM子句中,这种查询形式称为联接查询。

·嵌套查询:查询时要从多个基本表中提取数据,此时把多个基本表分别放在不同层次上的FROM子句中,这种查询形式称为嵌套查询。

·交互式SQL:在终端交互方式使用的SQL语言。

·嵌入式SQL:嵌入在高级语言的程序中使用的SQL语言。

·共享变量:嵌入的SQL语句和主语言语句间传递信息的变量,称为共享变量。共享变量先由主语言程序定义,再用SQL的说明语句说明,然后SQL语句就可使用这些变量。

·游标:游标是与某一查询相联系的符号名。游标有游标关系和游标指针两层含义。在游标打开时,游标(指针)指向查询结果的第一个记录之前。

·卷游标:在游标推进时,可以进退自如的游标。

3.2 对于教学数据库的三个基本表

S(S#,SNAME,AGE,SEX)

SC(S#,C#,GRADE)

C(C#,CNAME,TEACHER)

试用SQL的查询语句表达下列查询:

①检索LIU老师所授课程的课程号和课程名。

②检索年龄大于23岁的男学生的学号和姓名。

③检索学号为S3学生所学课程的课程名与任课教师名。

④检索至少选修LIU老师所授课程中一门课程的女学生姓名。

⑤检索WANG同学不学的课程的课程号。

⑥检索至少选修两门课程的学生学号。

⑦检索全部学生都选修的课程的课程号与课程名。

⑧检索选修课程包含LIU老师所授课程的学生学号。

解:① SELECT C#, CNAME

FROM C

WHERE TNAME=’LIU’;

② SELECT S#, SNAME

FROM S

WHERE AGE>23 AND SEX=’M’;

③ SELECT CNAME,TEACHER

FROM SC, C

WHERE SC.C#=C.C# AND S#=’S3’;

④ SELECT SNAME (联接查询方式)

FROM S, SC, C

WHERE S.S#=SC.S# AND SC.C#=C.C#

AND SEX=’F’ AND TNAME=’LIU’;

或:SELECT SNAME (嵌套查询方式)

FROM S

WHERE SEX=’F’

AND S# IN (SELECT S#

FROM SC

WHERE C# IN (SELECT C#

FROM C

WHERE TNAME=’LIU’));

或:SELECT SNAME (存在量词方式)

FROM S

WHERE SEX=’F’

AND EXISTS (SELECT *

FROM SC

WHERE SC.S#=S.S#

AND EXISTS (SELECT *

FROM C

WHERE C.C#=SC.C#

AND TNAME=’LIU’));

⑤ SELECT C#

FROM C

WHERE NOT EXISTS

(SELECT *

FROM S, SC

WHERE S.S#=SC.S# AND SC.C#=C.C#

AND SNAME=’WANG’);

⑥ SELECT DISTINCT X.S#

FROM SC AS X, SC AS Y

WHERE X.S#=Y.S# AND X.C#!=Y.C#;

⑦ SELECT C#, CNAME

FROM C

WHERE NOT EXISTS

(SELECT *

FROM S

WHERE NOT EXISTS

(SELECT *

FROM SC

WHERE S#=S.S# AND C#=C.C#));

在1974年的SYSTEM R系统中,曾使用过“集合包含”的语法,即

(集合1)CONTAINS(集合2)

用这种语法也能写出本题的SELECT语句,即:

SELECT C#,CNAME

FROM C

WHERE (SELECT S# FROM SC WHERE C#=C.C#)

CONTAINS

(SELECT S# FROM S);

由于判断“(集合1)CONTAINS(集合2)”与“NOT EXISTS((集合2)EXCEPT(集合1))”是等价的,因此本题的SELECT语句也能这样写:

SELECT C#,CNAME

FROM C

WHERE NOT EXISTS

((SELECT S# FROM S)

EXCEPT

(SELECT S# FROM SC WHERE C#=C.C#));

⑧ SELECT DISTINCT S#

FROM SC AS X

WHERE NOT EXISTS

(SELECT *

FROM C

WHERE TNAME=’LIU’

AND NOT EXISTS

(SELECT *

FROM SC AS Y

WHERE Y.S#=X.S# AND Y.C#=C.C#));

与⑦类似,本题的SELECT语句也能这样写:

SELECT DISTINCT S#

FROM SC X

WHERE NOT EXISTS

((SELECT C# FROM C WHERE TEACHER=’LIU’)

EXCEPT

(SELECT C# FROM SC Y WHERE Y.S#=X.S#));

3.3 对于第3.2题中的8个查询语句,试给出SELECT语句的图示形式。

解:为了说明问题,这里先用高级语言的算法形式表示其执行过程,再给出图示形式。

下面给出④、⑤、⑦、⑧的算法及图示形式。

④ 如果把三个关系S、SC、C看成三个文件,那么可以看出这个查询语句的SELECT语句实际上是一个三重循环。从而可得这个查询的算法形式如下:

for关系S的每个元组do

{which:=false;

if =’F’ then

for 关系SC的每个元组,且NOT which do

if SC.S#=S.S# then

for 关系C的每个元组,且NOT which do

if C.C#=SC.C#,且TEACHER=’LIU’ then

{print(); which:=true; }

};

这个算法可以用图3.1表示。

S S# SNAME AGE SEX SC S# C# GRADE C C# CNAME TEACHER

_X P. F _X _Y _Y LIU

图3.1

⑤for 关系S的每个元组 do

{if =’WANG’ then

for 关系C的每个元组 do

{which:=false;

for 关系SC的每个元组,且NOT which do

if SC.S# =S.S# ,且SC.C#=C.C# then which := true;

if NOT which then print();

};

这个算法可以用图3.2表示。图中“┐”表示“NOT EXISTS”,即“不存在满足此条件的元组”

S S# SNAME AGE SEX C C# CNAME TEACHER SC S# C# GRADE

_X WANG P._Y ┐ _X _Y

图3.2

⑦ for 关系C的每个元组 do

{which1 := false;

for 关系S的每个元组,且NOT which1 do

{ which2 := false;

for 关系SC的每个元组,且NOT which2 do

if SC.S# =S.S#, 且SC.C# =C.C# then which2 := true;

if NOT which2 then which1:=true;

};

if NOT which1 then print(C.C#,);

};

这个算法可以用图3.3表示。

C C# CNAME TEACHER S S# SNAME AGE SEX SC S# C# GRADE

P._X P. ┐ _Y ┐ _Y _X

图3.3

⑧ for 关系SC的每个元组x do

{which1 := false;

for 关系C的每个元组y,且NOT which1 do

{ if R=’LIU’then

{ which2 := false;

for 关系SC的每个元组z,且NOT which2 do

if z.S# =x.S#,且z.C# =y.C# then which2 := true;

if NOT which2 then which1:=true;

};

if NOT which1 then print(x.S#);

}

};

这个算法可以用图3.4表示。

SC S# C# GRADE C C# CNAME TEACHER SC S# C# GRADE

P._X P. ┐ _Y LIU ┐ _X _Y

图3.4

3.4 设有两个基本表R(A,B,C)和S(A,B,C),试用SQL查询语句表达下列关系代数表达式:

① R∪S ② R∩S ③ R-S ④ R×S ⑤πA,B(R) πB,C(S)

⑥ π1,6(σ3=4(R×S) ⑦π1,2,3( 3=3

R

S) ⑧ R÷πC(S)

解:① (SELECT * FROM R)

UNION

(SELECT * FROM S);

② (SELECT * FROM R)

INTERSECT

(SELECT * FROM S);

③ (SELECT * FROM R)

MINUS

(SELECT * FROM S);

④ SELECT *

FROM R, S;

⑤ SELECT R.A, R.B, S.C

FROM R, S

WHERE R.B=S.B;

⑥ SELECT R.A, S.C

FROM R, S

WHERE R.C=S.A;

⑦ SELECT R.* (R.*表示R中全部属性)

FROM R, S

WHERE R.C=S.C;

⑧ R÷πC(S)的元组表达式如下:

{ t |(∃u)(∀v)(∃w)(R(u)∧ S(v)∧ R(w)∧ w[1]=u[1] ∧ w[2]=u[2]

∧ w[3]=v[3] ∧ t[1]=u[1] ∧ t[2]=u[2])}

据此,可写出SELECT语句:

SELECT A, B

FROM R RX

WHERE NOT EXISTS

( SELECT *

FROM S

WHERE NOT EXISTS

( SELECT *

FROM R RY

WHERE RY.A=RX.A AND RY.B=RX.B AND RY.C=S.C));

3.5 设有两个关系R(A,B)和S(A,C),试用SQL查询语句表示下列域表达式:

① { a |($b)(R(ab)∧ b=‘17’)}

② { abc | R(ab)∧ S(ac)}

③ { a |($c)($b1)($b2)(S(ac)∧R(ab1)∧ R(cb2)∧ b1>b2)}

解:① SELECT A

FROM R

WHERE B=17;

② SELECT R.A, R.B, S.C

FROM R, S

WHERE R.A=S.A;

③ SELECT S.A

FROM S, R RX, R RY

WHERE S.A=RX.A AND RX.B>RY.B;

3.6 试叙述SQL语言的关系代数特点和元组演算特点。

答:SQL的关系代数特点如下:

① 有关系代数运算的并、交、差、自然联接等运算符;

② FROM子句体现了笛卡尔积操作,WHERE子句体现了选择操作,SELECT子句体现了投影操作。

SQL的元组演算特点如下:

① FROM子句中的基本表名应视为“元组变量”,属性名应视为“元组分量”;

② 有存在量词EXISTS符号。

3.7 试用SQL查询语句表达下列对3.2题中三个基本表S、SC、C的查询:

① 在表C中统计开设课程的教师人数。

② 求选修C4课程的女学生的平均年龄。

③ 求LIU老师所授课程的每门课程的平均成绩。

④ 统计每个学生选修课程的门数(超过5门的学生才统计)。要求输出学生学号和选修门数,查询结果按门数降序排列,若门数相同,按学号升序排列。

⑤ 检索学号比WANG同学大,而年龄比他小的学生姓名。

⑥ 在表SC中检索成绩为空值的学生学号和课程号。

⑦ 检索姓名以L打头的所有学生的姓名和年龄。

⑧ 求年龄大于女同学平均年龄的男学生姓名和年龄。

⑨ 求年龄大于所有女同学年龄的男学生姓名和年龄。

解:① SELECT COUNT(DISTINCT TEACHER)

FROM C;

② SELECT AVG(AGE)

FROM S, SC

WHERE S.S#=SC.S# AND C#=’C4’ AND SEX=’F’;

③ SELECT C.C#,AVG(GRADE)

FROM SC,C

WHERE SC.C#=C.C# AND TEACHER=‘LIU’

GROUP BY C.C#;

④ SELECT S#, COUNT(C#)

FROM SC

GROUP BY S#

HAVING COUNT(*)>5

ORDER BY 2 DESC, 1;

⑤ SELECT SNAME

FROM S

WHERE S#>ALL(SELECT S#

FROM S

WHERE SNAME=’WANG’)

AND AGE

FROM S

WHERE SNAME=’WANG’);

⑥ SELECT S#, C#

FROM SC

WHERE GRADE IS NULL;

⑦ SELECT SNAME, AGE

FROM S

WHERE SNAME LIKE ’L%’;

⑧ SELECT SNAME, AGE

FROM S

WHERE SEX=’M’

AND AGE>(SELECT AVG(AGE)

FROM S

WHERE SEX=’F’);

⑨ SELECT SNAME, AGE

FROM S

WHERE SEX=’M’

AND AGE>ALL(SELECT AGE

FROM S

WHERE SEX=’F’);

3.8 对于下面的关系R和S,试求出下列各种联接操作的执行结果:

① R NATURAL INNER JOIN S

② R NATURAL RIGHT OUTER JOIN S

③ R RIGHT OUTER JOIN S USING(C)

④ R INNER JOIN S

⑤ R FULL OUTER JOIN S ON false

R A B C S B C D

a1 b1 c1 b1 c1 d1

a2 b2 c2 b2 c2 d2

a3 b3 c3 b4 c4 d4

解:

① A B C D ② A B C D ③ A R.B C

S.B

D

b1

a1 b1 c1 d1 a1 b1 c1 d1 a1 b1 c1 d1

b2

a2 b2 c2 d2 a2 b2 c2 d2 a2 b2 c2 d2

b4

null b4 c4 d4 null null c4 d4

④ A R.B R.C S.B S.C D ⑤ A R.B R.C S.B

S.C

D

a b1 c1 b1 c1 d1 a1 b1 c1 null

null

null

b1 c1 b2 c2 d2 a2 b2 c2 null

null

null

b1 c1 b4 c4 d4 a3 b3 c3 null

null

null

c1

b2 c2 b1 c1 d1 null

null

null b1 d1

c2

b2 c2 b2 c2 d2 null

null

null b2 d2

c4

b2 c2 b4 c4 d4 null

null

null b4 d4

b3 c3 b1 c1 d1

b3 c3 b2 c2 d2

b3 c3 b4 c4 d4

3.9 SQL2提供CASE表达式操作,这个操作类似于程序设计语言中的多分支选择结构,其句法如下:

CASE

WHEN 条件1 THEN 结果1

WHEN 条件2 THEN 结果2

……

WHEN 条件n THEN 结果n

ELSE 结果m

END

如果自上而下“条件i”首先被满足,那么这个操作返回值“结果i”(可以是某个表达式的值);如果没有一个条件被满足,那么返回值“结果m”。

在基本表SC(S#,C#,GRADE)中,GRADE值是百分制。如果欲转换成“成绩等第”,则规则如下:若GRADE<40则等第为F,若40≤GRADE<60则等第为C,若60≤GRADE<80则等第为B,若80≤GRADE则等第为A。试写出下列两个查询语句:

① 检索每个学生的学习成绩,成绩显示时以等第(SCORE)形式出现。

② 检索每个等第的学生人次数。

解:① SELECT S#,C#,CASE

WHEN GRADE >= 80 THEN 'A'

WHEN GRADE >= 60 THEN 'B'

WHEN GRADE >= 40 THEN 'C'

ELSE 'F'

END AS SCORE

FROM SC;

② SELECT SCORE,COUNT(S#)

FROM (SELECT S#,C#,CASE

WHEN GRADE >= 80 THEN 'A'

WHEN GRADE >= 60 THEN 'B'

WHEN GRADE >= 40 THEN 'C'

a1

a1

a2

a2

a2

a3

a3

a3

1

ELSE 'F'

END

FROM SC) AS RESULT(S#,C#,SCORE)

GROUP BY SCORE;

3.10 用第3.9题给出的CASE操作在下列更新语句中完成SC表中的元组更新:

① 若课程号为C5则增加6分,若课程号为C8则增加10分,其他一律增加5分。

② 若C4课程的成绩低于该门课平均成绩时,提高5%,否则提高4%。

解:① UPDATE SC

SET GRADE = GRADE + CASE

WHEN C# ='C5' THEN 6

WHEN C# ='C8' THEN 10

ELSE 5

END ;

② UPDATE SC

SET GRADE = GRADE * CASE

WHEN GRADE <(SELECT AVG(GRADE)

FROM SC

WHERE C# ='C4')

THEN 1.05

ELSE 1.04

END

WHERE C# ='C4';

3.11 设零件之间有组合联系,其关系模式如下:

PART(P#,PNAME,SUBP#,TOTAL)

其属性表示零件编号、零件名称、所需子零件编号及数量。设临时关系W(P#,SUBP#)的属性分别表示零件编号、这种零件的直接或间接子零件编号。

① 试写出表示关系W的规则。

② 写出计算W的递归查询语句。

解:① W(x, y)←PART(x, g, y, h)

W(x, y)←W(x, z)∧ W(z, y)

② WITH RECURSIVE W(P#, SUBP#) AS

(SELECT P#, SUBP# FROM PART)

UNION

(SELECT W1.P#, #

FROM W AS W1, W AS W2

WHERE #=W2.P#)

SELECT * FROM W;

3.12 试用SQL更新语句表达对3.2题教学数据库中关系S、SC、C的更新操作:

① 往关系C中插一个课程元组('C8','VC++','BAO')。

② 检索所授每门课程平均成绩均大于80分的教师姓名,并把检索到的值送往另一个已存在的表FACULTY(TNAME)。

③ 在SC中删除尚无成绩的选课元组。

④ 把选修LIU老师课程的女同学选课元组全部删去。

⑤ 把MATHS课不及格的成绩全改为60分。

⑥ 把低于所有课程总平均成绩的女同学成绩提高5%。

⑦ 在表SC中修改C4课程的成绩,若成绩小于等于70分时提高5%,若成绩大于70

分时提高4%(用两种方法实现,一种方法是用两个UPD

ATE语句实现,另一种方法是用带CASE操作的一个UPDATE语句实现)。

⑧ 在表SC中,当某个成绩低于全部课程的平均成绩时,提高5%。

解:① INSERT INTO C

VALUES('C8','VC++','BAO');

② INSERT INTO FACULTY(TNAME)

SELECT DISTINCT TEACHER

FROM (SELECT TEACHER, C.C#, AVG(GRADE)

FROM S, SC

WHERE SC.C#=C.C#

GROUP BY TEACHER, C.C#)

AS RESULT(TEACHER, C#, AVG_GRADE) AS X

WHERE 80<=ALL(SELECT AVG_GRADE

FROM RESULT AS Y

WHERE R=R);

③ DELETE FROM SC

WHERE GRADE IS NULL;

④ DELETE FROM SC

WHERE S# IN(SELECT S# FROM S WHERE SEX='F')

AND C# IN(SELECT C# FROM C WHERE TEACHER='LIU');

⑤ UPDATE SC

SET GRADE=60

WHERE GRADE<60

AND C# IN(SELECT C# FROM C WHERE CNAME='MATHS');

⑥ UPDATE SC

SET GRADE=GRADE*1.05

WHERE S# IN(SELECT S# FROM S WHERE SEX='F')

AND GRADE<(SELECT AVG(GRADE) FROM SC);

⑦ 用两个UPDATE语句实现:

UPDATE SC

SET GRADE=GRADE*1.04

WHERE C#='C4' AND GRADE>70;

UPDATE SC

SET GRADE=GRADE*1.05

WHERE C#='C4' AND GRADE<=70;

(这两个UPDATE语句的顺序不能颠倒。)

用一个UPDATE语句实现:

UPDATE SC

SET GRADE=GRADE*CASE

WHEN GRADE>70 THEN 1.04

ELSE 1.05

END

WHERE C#='C4';

⑧ UPDATE SC

SET GRADE=GRADE*1.05

WHERE GRADE<(SELECT AVG(GRADE)

FROM SC);

3.13 设数据库中有三个关系:

职工表 EMP(E#,ENAME,AGE,SEX,ECITY),

其属性分别表示职工工号、姓名、年龄、性别和籍贯。

工作表 WORKS(E#,C#,SALARY),

其属性分别表示职工工号、工作的公司编号和工资。

公司表 COMP(C#,CNAME,CITY),

其属性分别表示公司编号、公司名称和公司所在城市。

试用SQL语句写出下列操作:

① 用CREATE TABLE语句创建上述三个表,需指出主键和外键。

② 检索超过50岁的男职工的工号和姓名。

③ 假设每个职工只能在一个公司工作,检索工资超过1000元的男性职工工号和姓名。

④ 假设每个职工可在多个公司工作,检索在编号为C4和C8公司兼职的职工工号和姓名。

⑤ 检索在“联华公司”工作、工资超过1000元的男性职工的工号和姓名。

⑥ 假设每个职工可在多个公司工作,检索每个职工的兼职公司数目和工资总数.显示(E#,NUM,SUM_SALARY),分别表示工号、公司数目和工资总数。

⑦ 工号为E6的职工在多个公司工作,试检索至少在E6职工兼职的所有公司工作的职工工号。

⑧ 检索联华公司中低于本公司平均工资的职工工号和姓名。

⑨ 在每一公司中为50岁以上职工加薪100元(若职工为多个公司工作,可重复加)。

⑩ 在EMP表和WORKS表中删除年龄大于60岁的职工有关元组。

解:① CREATE TABLE EMP

( E# CHAR(4) NOT NULL,

ENAME CHAR(8) NOT NULL,

AGE SMALLINT,

SEX CHAR(1),

ECITY CHAR(20),

PRIMARY KEY(E#));

CREATE TABLE COMP

( C# CHAR(4) NOT NULL,

CNAME CHAR(20) NOT NULL,

CITY CHAR(20),

PRIMARY KEY(C#));

CREATE TABLE WORKS

( E# CHAR(4) NOT NULL,

C# CHAR(4) NOT NULL,

SALARY SMALLINT,

PRIMARY KEY(E#, C#),

FOREIGN KEY(E#) REFERENCES EMP(E#),

FOREIGN KEY(C#) REFERENCES COMP(C#));

② SELECT E#, ENAME

FROM EMP

WHERE AGE>50 AND SEX='M';

③ SELECT EMP.E#, ENAME

FROM EMP, WORKS

WHERE EMP.E#=WORKS.E# AND SALARY>1000;

④ SELECT A.E#,

FROM EMP A, WORKS B, WORKS C

WHERE A.E#=B.E# AND B.E#=C.E#

AND B.C#='C4' AND C.C#='C8';

⑤ SELECT A.E#,

FROM EMP A, WORKS B, COMP C

WHERE A.E#=B.E# AND B.C#=C.C#

AND CNAME='联华公司' AND SALARY>1000

AND SEX='M';

⑥ SELECT E#, COUNT(C#) AS NUM, SUM(SALARY) AS SUM_SALARY

FROM WORKS

GROUP BY E#;

⑦ SELECT X.E#

FROM WORKS X

WHERE NOT EXISTS

(SELECT *

FROM WORKS Y

WHERE E#='E6'

AND NOT EXISTS

(SELECT *

FROM WORKS Z

WHERE Z.E#=X.E#

AND Z.C#=Y.C#));

⑧ SELECT A.E#,

FROM EMP A, WORKS B, COMP C

WHERE A.E#=B.E# AND B.C#=C.C#

AND CNAME='联华公司'

AND SALARY<(SELECT AVG(SALARY)

FROM WORKS, COMP

WHERE WORKS.C#=COMP.C#

AND CNAME='联华公司');

⑨ UPDATE WORKS

SET SALARY=SALARY+100

WHERE E# IN (SELECT E# FROM EMP WHERE AGE>50);

⑩ DELETE FROM WORKS

WHERE E# IN (SELECT E# FROM EMP WHERE AGE>60);

DELETE FROM EMP

WHERE AGE>60;

3.14 对第3.13题中的关系建立一个有关女职工信息的视图EMP_WOMAN,属性包括(E#,ENAME,C#,CNAME,SALARY)。

然后对视图EMP_WOMAN操作,检索每一位女职工的工资总数。(假设每个职工可在多个公司兼职)

解: CREATE VIEW EMP_WOMAN

AS SELECT A.E#, , C.C#, CNAME, SALARY

FROM EMP A, WORKS B, COMP C

WHERE A.E#=B.E# AND B.C#=C.C#

AND SEX='F';

SELECT E#,SUM(SALARY)

FROM EMP_WOMAN

GROUP BY E#;

3.15 在第1章中提到的仓库管理数据库中有五个基本表:

零件 PART(P#,PNAME,COLOR,WEIGHT)

项目 PROJECT(J#,JNAME,DATE)

供应商 SUPPLIER(S#,SNAME,SADDR)

供应 P_P(J#,P#,TOTAL)

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

① 试用SQL DDL语句定义上述五个基本表,需说明主键和外键。

② 试将PROJECT、P_P、PART三个基本表的联接定义为一个视图VIEW1,将PART、P_S、SUPPLIER三个基本表的联接定义为一个视图VIEW2。

③ 试在上述两个视图的基础上进行查询操作:

a)检索上海的供应商所供应的零件的编号和名称。

b)检索项目J4所用零件的供应商的编号和名称。

解:① CREATE TABLE PART

(P# CHAR(6),

PNAME CHAR(10) NOT NULL,

COLOR CHAR(6),

WEIGHT FLOAT(6),

PRIMARY KEY(P#));

CREATE TABLE PROJECT

(J# CHAR(6),

JNAME CHAR(12) NOT NULL,

DATE DATE,

PRIMARY KEY(J#));

CREATE TABLE SUPPLIER

(S# CHAR(8),

SNAME CHAR(12) NOT NULL,

SADDR VARCHAR(30),

PRIMARY KEY(S#));

CREATE TABLE P_P

(J# CHAR(6),

P# CHAR(6),

TOTAL INTEGER,

PRIMARY KEY (J#, P#)

FOREIGN KEY(J#) REFERENCES PROJECT(J#),

FOREIGN KEY(P#) REFERENCES PART(P#));

CREATE TABLE P_S

(P# CHAR(6),

S# CHAR(8),

QUANTITY INTEGER,

PRIMARY KEY (P#, S#)

FOREIGN KEY(P#) REFERENCES PART(P#),

FOREIGN KEY(S#) REFERENCES SUPPLIER(S#));

② CREATE VIEW VIEW1

AS SELECT A.J#, JNAME, DATE, C.P#, PNAME, COLOR,

WEIGHT, TOTAL

FROM PROJECT A, P_P B, PART C

WHERE A.J#=B.J# AND B.P#=C.P#;

CREATE VIEW VIEW2

AS SELECT A.P#, PNAME, COLOR, WEIGHT, C.S#, SNAME,

SADDR, QUANTITY

FROM PART A, P_S B, SUPPLIER C

WHERE A.P#=B.P# AND B.S#=C.S#;

③ a) SELECT P#, PNAME

FROM VIEW2

WHERE SADDR LIKE ’上海%’;

b) SELECT S#, SNAME

FROM VIEW1, VIEW2

WHERE VIEW1.P#=VIEW2.P#

AND J#=’J4’;

3.16 对于3.2题的教学数据库中基本表SC,建立一个视图:

CREATE VIEW S_GRADE(S#,C_NUM,AVG_GRADE)

AS SELECT S#,COUNT(C#),AVG(GRADE)

FROM SC

GROUP BY S#;

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

① SELECT *

FROM S_GRADE;

② SELECT S#,C_NUM

FROM S_GRADE

WHERE AVG_GRADE>80;

③ SELECT S#,AVG_GRADE

FROM S_GRADE

WHERE C_NUM >(SELECT C_NUM

FROM S_GRADE

WHERE S#='S4');

④ UPDATE S_GRADE

SET S#='S3'

WHERE S#='S4';

⑤ DELETE FROM S_GRADE

WHERE C_NUM>4;

答:① 允许查询。相应的操作如下:

SELECT S#,COUNT(C#) AS C_NUM,AVG(GRADE) AS AVG_GRADE

FROM SC

GROUP BY S#;

② 允许查询。相应的操作如下:

SELECT S#,COUNT(C#) AS C_NUM

FROM SC

GROUP BY S#

HAVING AVG(GRADE)> 80;

③ 允许查询。相应的操作如下:

SELECT S#,AVG(GRADE) AS AVG_GRADE

FROM SC

GROUP BY S#

HAVING COUNT(C#)> (SELECT COUNT(C#)

FROM SC

GROUP BY S#

HAVING S#='S4');

④ 不允许。C_NUM是对SC中的学生选修门数进行统计,在未更改SC表时,要在视图S_GRADE中更改门数,是不可能的。

⑤ 不允许。在视图S_GRADE中删除选修门数在4门以上的学生元组,势必造成SC中这些学生学习元组的删除,这不一定是用户的原意,因此使用分组和聚合操作的视图,不允许用户执行更新操作。

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

答:此时宿主语言的编译程序不必改动,只要提供一个SQL函数定义库,供编译时使用。预处理方式只是把源程序中的SQL语句处理成宿主语言的函数调用形式。

3.18 在宿主语言的程序中使用SQL语句有哪些规定?

答:有三条规定:

① 在程序中要区分SQL语句与宿主语言语句,所有SQL语句必须加前缀标识“EXEC SQL”以及结束标志“END_EXEC”;

② 允许嵌入的SQL语句引用宿主语言的程序变量,而主语句不能引用数据库中的字段变量;

③ SQL的集合处理方式与宿主语言的单记录处理方式之间要用游标机制协调。

3.19 SQL的集合处理方式与宿主语言单记录处理方式之间如何协调?

答:用游标机制协调。把SELECT语句查询结果定义成游标关系,以使用文件的方式来使用游标关系。与游标有关的SQL语句有四个:游标定义,游标打开,游标推进,游标关闭。

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

答:不涉及游标的DML语句有下面两种情况:

① INSERT、DELETE、UPDATE语句,只要加上前缀和结束标志,就能嵌入在宿主语言程序中使用;

② 对于SELECT语句,如果已知查询结果肯定是单元值,也可不必涉及游标操作。

涉及游标的DML语句有下面两种情况:

① 当SELECT语句查询结果是多个元组时,必须用游标机制把多个元组一次一个地传递给主程序处理;

② 对游标指向元组进行修改或删除操作时,也涉及到游标。

3.21 在教学数据库中检索成绩不及格的学生信息,要求显示(S#,SNAME,C#,CNAME,TEACHER),试编写实现此功能的嵌有SQL语句的C语言程序段。

解: #define NO_MORE_TUPLES !(strcmp(SQLSTATE,〞02000〞))

void sel()

{ EXEC SQL BEGIN DECLARE SECTION;

char sno[5],cno[5],sname[9],cname[11],teacher[9];

char SQLSTATE[6];

EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE x CURSOR FOR

SELECT s.s#,sname,c.c#,cname,teacher

FROM s,sc,c

WHERE s.s#=sc.s# and sc.c#=c.c# and grade<60;

EXEC SQL OPEN scx;

while(1)

{ EXEC SQL FETCH FROM x

INTO :sno,:sname,:cno,:cname,:teacher;

if(NO_MORE_TUPLES)break;

printf(〞%s,%s,%s,%s,%sn〞,sno,sname,cno,cname,teacher);

}

EXEC SQL CLOSE x;

}

3.3 练习题

3.3.1 填空题

1.在SQL中,关系模式称为__________,子模式称为__________,元组称为__________,属性称为__________。

2.SQL中,表有两种:__________和__________,也称为__________和__________。

3.SQL中,用户有两种:__________和__________。

4.SQL中,外模式一级数据结构的基本单位是__________。

5.在“SQL模式”中,主要成分有__________。

6.基本表中,“主键”概念应该体现其值的__________和__________两个特征。

7.操作“元组 IN(集合)”的语义是____________________。

8.表达式中的通配符“%”表示__________,“_”(下划线)表示__________。

9.操作“元组>SOME(集合)”的语义是____________________。

10.操作“元组

11.SQL有两种使用方式:__________和__________。

12.嵌入式SQL的预处理方式,是指预处理程序先对源程序进行扫描,识别出__________,并处理成宿主语言的__________形式。

13.为保证嵌入式SQL的实现,通常DBMS制造商提供一个__________,供编译时使用。

14.SQL语句嵌入在C语言程序中时,必须加上前缀标识__________和结束标志__________。

15.“卷游标”是指____________________。

3.3.2 单项选择题(在备选答案中选出一个正确答案)

1.在SQL中,用户可以直接进行查询操作的是 [ ]

A.实表和虚表 B.基本表和实表

C.视图和虚表 D.基本表

2.SQL中,聚合函数COUNT(列名)用于 [ ]

A.计算元组个数 B.计算属性的个数

C.对一列中的非空值计算个数 D.对一列中的非空值和空值计算个数

3.SQL中,与“NOT IN”等价的操作符是 [ ]

A.=SOME B.<>SOME C.=ALL D.<>ALL

4.元组比较操作(a1,a2)>(b1,b2)的意义是 [ ]

A.(a1>b1)OR((a1=b1)AND(a2>=b2))

B.(a1>=b1)OR((a1=b1)AND(a2>=b2))

C.(a1>b1)OR((a1=b1)AND(a2>b2))

D.(a1>=b1)OR((a1=b1)AND(a2>b2)

5.SQL中,谓词EXISTS可用来测试一个集合是否 [ ]

A.有重复元组 B.有重复的列名

C.为非空集合 D.有空值

6.对于基本表EMP(ENO,ENAME,SALARY,DNO)

其属性表示职工的工号、姓名、工资和所在部门的编号。

基本表DEPT(DNO,DNAME)

其属性表示部门的编号和部门名。

有一SQL语句:

SELECT COUNT(DISTINCT DNO)

FROM EMP;

其等价的查询语句是 [ ]

A.统计职工的总人数 B.统计每一部门的职工人数

C.统计职工服务的部门数目 D.统计每一职工服务的部门数目

7.对于第6题的两个基本表,有一个SQL语句:

SELECT ENO,ENAME

FROM EMP

WHERE DNO NOT IN

(SELECT DNO

FROM DEPT

WHERE DNAME='金工车间';

其等价的关系代数表达式是: [ ]

A.πENO,ENAME(σDNAME≠'金工车间'(EMP⋈DEPT))

B.πENO,ENAME(EMP ⋈ DEPT)

C.πENO,ENAME(EMP)-πENO,ENAME(σDNAME='金工车间'(EMP⋈DEPT))

DNAME≠'金工车间'

D.πENO,ENAME(EMP)-πENO,ENAME(σDNAME≠'金工车间'(EMP⋈DEPT))

8.对于第6题的两个基本表,有一个SQL语句:

UPDATE EMP

SET SALARY=SALARY*1.05

WHERE DNO='D6'

AND SALARY<(SELECT AVG(SALARY)

FROM EMP);

其等价的修改语句为 [ ]

A.为工资低于D6部门平均工资的所有职工加薪5%

B.为工资低于整个企业平均工资的职工加薪5%

C.为在D6部门工作、工资低于整个企业平均工资的职工加薪5%

D.为在D6部门工作、工资低于本部门平均工资的职工加薪5%

9.有关嵌入式SQL的叙述,不正确的是 [ ]

A.宿主语言是指C一类高级程序设计语言

B.宿主语言是指SQL语言

C.在程序中要区分SQL语句和宿主语言语句

D.SQL有交互式和嵌入式两种使用方式

10.嵌入式SQL实现时,采用预处理方式是 [ ]

A.把SQL语句和主语言语句区分开来

B.为SQL语句加前缀标识和结束标志

C.识别出SQL语句,并处理成函数调用形式

D.把SQL语句编译成二进制码

11.允许在嵌入的SQL语句中,引用宿主语言的程序变量,在引用时

A.直接引用

B.这些变量前必须加符号“*”

C.这些变量前必须加符号“:”

D.这些变量前必须加符号“&”

12.如果嵌入的SELECT语句的查询结果肯定是单元组,那么嵌入时

A.肯定不涉及游标机制

B.必须使用游标机制

C.是否使用游标,由应用程序员决定

D.是否使用游标,与DBMS有关

13.卷游标的推进语句“EXEC SQL FETCH RELATIVE -4”表示

A.把游标移向查询结果的第4行

B.把游标移向查询结果的倒数第4行

C.把游标从当前位置推进4行

D.把游标从当前位置返回4行

14.卷游标的推进语句“EXEC SQL FETCH ABSOLUTE -3 ”表示

A.把游标移向查询结果的第3行

B.把游标移向查询结果的倒数第3行

C.把游标从当前位置推进3行

D.把游标从当前位置返回3行

3.3.3 简答题

1.试叙述SQL的关系代数特点和元组演算特点。

2.SQL语言对于“查询结果是否允许存在重复元组”是如何实现的?

3.试对SELECT语句中使用的基本表名和列名的语义作详细的解释。

4.SELECT语句中,何时使用分组子句,何时不必使用分组子句?

3.4 练习题答案

3.4.1 填空题答案

1.基本表 视图 行 列

2.基本表 视图 实表 虚表

3.应用程序 终端用户

4.视图

5.基本表、视图、索引、完整性规则等

6.惟一 非空

7.若元组在集合中,其值为true,否则为false

8.与零个或多个字符组成的字符串匹配 与单个字符匹配

9.若元组值大于集合中某一元组值,则其值为true,否则为false

10.若元组值小于集合中每一元组值,则其值为true,否则为false

11.交互式SQL 嵌入式SQL

12.SQL语句 函数调用

13.SQL函数定义库

14.EXEC SQL 分号(;)

15.可以进退自如的游标(即可随意推进或返回)

3.4.2 单项选择题答案

[ ]

[ ]

[ ]

[ ]

1.A 2.C 3.D 4.C 5.C 6.C 7.C

8.C 9.B 10.C 11.C 12.C 13.D 14.B

3.4.3 简答题答案

1.答:SQL的SELECT语句的基本句法来自于关系代数表达式πL(σF(R1×…×Rm)),并且SQL中有并(UNION)、交(INTERSECT)和差(EXCEPT)等操作,因此SQL具有关系代数特点。

SELECT语句中出现的基本表名,都应该理解成基本表中的元组变量,而列名应理解成元组分量,这样SQL就具有了元组演算的特点。

2.答:对于SELECT语句中SELECT子句,若用“SELECT DISTINCT”形式,则查询结果中不允许有重复元组;若不写DISTINCT字样,则查询结果中允许出现重复元组。

3.答:在基本SQL中,SELECT语句中使用的基本表名都应该理解成表中的元组变量,而列名就成了元组分量。这样就使SELECT语句带有元组演算的特点。

(注:实际上,在基本SQL中,把关系变量和元组变量混为一谈了。这在面向对象数据库中得到了纠正,在引用表时,都要为表定义一个元组变量。)

4.答:SELECT语句中使用分组子句的先决条件是要有聚合操作。当聚合操作值与其他属性的值无关时,不必使用分组子句。譬如求男同学的人数。此时聚合值只有一个,因此不必分组。

当聚合操作值与其他属性的值有关时,必须使用分组子句。譬如求每一性别的人数。此时聚合值有两个,与性别有关,因此必须分组。

第4章 模式设计理论

4.1 基本知识点

4.1.1 本章重要概念

(1)关系模式的冗余和异常问题。

(2)FD的定义、逻辑蕴涵、闭包、推理规则、与关键码的联系;平凡的FD;属性集

的闭包;推理规则的正确性和完备性;FD集的等价;最小依赖集。

(3)无损分解的定义、性质、测试;保持依赖集的分解。

(4)关系模式的范式:1NF,2NF,3NF,BCNF。分解成2NF、3NF模式集的算法。

(5)MVD、4NF、JD和5NF的定义。

4.1.2 本章的重点篇幅

(1)教材中P148的例4.13。(无损联接和保持FD的例子)

(2)教材中P149的例4.14和P150的例4.15。(分解成2NF和3NF的例子)

4.2 教材中习题4的解答

4.1 名词解释

·数据冗余:指同一个数据在系统中多次重复出现。

·函数依赖(FD):在关系模式R(U)中,FD是形为X→Y的一个命题,只要r是R的当前关系,对r中任意两个元组t和s,都有t[X]=s[X]蕴涵t[Y]=s[Y],那么称FD X→Y在关系模式R(U)中成立。

·平凡的FD:如果X→Y,且Y⊆X,则称X→Y是一个“平凡的FD”。

+·FD集F的闭包F:被F逻辑蕴涵的函数依赖全体构成的集合,称为F的闭包,记为F+,即F+={ X→Y | F⊨X→Y}。

·属性集X的闭包X+:从已知的FD集F使用FD推理规则推出的所有满足X→A的属性A的集合,称为X的闭包,记为X+,即X+={ 属性A | X→A在F+中 }。

·FD的逻辑蕴涵:如果从已知的FD集F能推导出X→Y成立,那么称F逻辑蕴涵

X→Y,记为F ⊨X→Y。

·FD集的等价:对于两个FD集F和G,有F+=G+,则称F和G是等价的依赖集。

·最小依赖集:设F是属性集U上的FD集,Fmin是F的最小依赖集,那么Fmin应满足下列四个条件:Fmin+=F+;每个FD的右边都是单属性;Fmin中没有冗余的FD;每个FD的左边没有冗余的属性。

·无损分解:设关系模式R,F是R上的FD集,ρ={ R1,…,Rk }是R的一个分解。k

如果对R中满足F的每一关系r,都有r= ⋈πRi(r),那么称分解ρ相对F是“无损分解”。

i=1

·泛关系假设:指数据库中每一个关系都是全部属性构成的关系的投影,此时,由全部属性构成的关系称为泛关系。

·chase过程:根据已知FD集,对R分解成ρ构造的初始表格的值进行修改,使之符合FD集,这个过程称为chase过程。

·保持FD:设关系模式R,F是R上的FD分解,ρ={ R1,…,Rk }是R的一个分解,k

如果有∪πi=1

Ri(F)⊨F,那么称分解ρ保持FD集F。

·1NF:如果关系模式R的每个关系r的属性值都是不可分的原子值,那么称R是1NF的模式。

·2NF:如果R是1NF的模式,且每个非主属性完全函数依赖于R的候选键,那么称R是2NF的模式。

·3NF:如果R是1NF的模式,且每个非主属性都不传递依赖于R的候选键,那么称R是3NF的模式。

·BCNF:如果R是1NF的模式,且每个属性都不传递依赖于R的候选键,那么称R是BCNF的模式。

·4NF:设D是关系模式R上成立的FD和MVD集合。如果D中每个非平凡的 MVD

X→→Y的左部X都是R的超键,那么称R是4NF模式。

·5NF:如果关系模式R的每个JD均由R的候选键蕴涵,那么称R是5NF的模式。

·多值依赖(MVD):设关系模式R(U),X和Y是U的子集,Z=U-X-Y。对于R的关系r,若在r中存在元组(x,y1,z1)和(x,y2,z2),就也应存在元组(x,y2,z1)和(x,y1,z2),那么称MVD X→→Y在模式R上成立。

·联接依赖(JD):设关系模式R(U),R1、…、Rn是U的子集,并满足U=R1∪…∪Rn,ρ={ R1,…,Rn }是R的一个分解。如果对于R的每个关系r都有mρ(r)=r,那么称 JD

*(R1,…,Rn)在模式R上成立。

4.2 用A1、A2和A3三条推理规则来证明4.2.3节中的定理4.2(推理规则A4~A8)。

(1) A4(合并性,union):{ X→Y,X→Z }⊨X→YZ。

证明:已知X→Y,根据A2,两边用X扩充,得到X→XY。从已知X→Z,根据A2两边用Y扩充,得到XY→YZ。再根据A3,从X→XY和XY→YZ可得到X→YZ。

(2) A5(分解性,decomposition):{ X→Y,Z证明:已知ZY }⊨X→Z。

Y,可得Y→Z。从Y→Z和已知X→Y,可得X→Z成立。

(3) A6(伪传递性):{ X→Y,WY→Z }⊨WX→Z。

证明:已知X→Y,根据A2,两边用W扩充,得到WX→WY。据WX→WY和已知的WY→Z,。再根据A3,可得WX→Z成立。

(4) A7(复合性,composition):{ X→Y,W→Z }⊨XW→YZ。

证明:已知X→Y,根据A2,两边用W扩充,得到WX→WY。从已知W→Z,根据A2两边用Y扩充,得到WY→YZ。再根据A3,从WX→WY和WY→YZ可得到XW→YZ成立。

(5) A8 { X→Y,W→Z }⊨X∪(W-Y)→YZ。

证明:已知X→Y,根据A2,两边用(W-Y)扩充,得到X∪(W-Y)→Y∪(W-Y),而

Y∪(W-Y)=WY,因此有X∪(W-Y)→WY。从已知W→Z,根据A2两边用Y扩充,得到WY→YZ。再根据A3,从X∪(W-Y)→WY和WY→YZ可得到X∪(W-Y)→YZ。

4.3 对函数依赖X→Y的定义加以扩充,X和Y可以为空属性集,用φ表示,那么X→φ,φ→Y,φ→φ的含义是什么?

答:据推理规则的自反律可知,Xф和фф是平凡的FD,总是成立的。

而фY表示在当前关系中,任意两个元组的Y值相等,也就是当前关系的Y值都相等。

4.4 设关系模式R有n个属性,在模式R上可能成立的函数依赖有多少个?其中平凡的FD有多少个?非平凡的FD有多少个?

解:这个问题是排列组合问题。FD形为X1Y,从n个属性值中选择属性组成X共有C0n+CnY形式应该有2n·2n=4n种方nn+ … +Cn=2种方法;同理,组成Y也有2种方法。因此组成Xn法。即可能成立的FD有4n个。

平凡的FD要求YX,组合XY形式的选择有:

01(C0+C1)+C2·012n01nC0n·C0+Cn·11n(C2+C2+C2)+ … +Cn(Cn+Cn+ … Cn)012nnn12n=C0n·2+Cn·2+Cn·2+ … +Cn·2=(1+2)=3


本文标签: 关系 数据 语句 查询 元组