数据库系统原理课后答案 第九章
数据库系统原理04735课后习题参考答案
数据库系统原理课后习题第一章. 数据库系统基本概念1.1.名词解释DB——DB是长期存储在计算机内、有组织的、统一管理的相关数据的集合。
DB能为各种用户共享,具有较小冗余度、数据间联系紧密而又有较高的数据独立性等特点。
DBMS——是位于用户与操作系统之间的一层数据管理软件,它为用户或应用程序提供访问DB的方法,包括DB的建立、查询、更新及各种数据控制。
DBS——是实现有组织地、动态地存储大量关联数据、方便多用户访问的计算机硬件、软件和数据资源组成的系统,即它是采用数据库技术的计算机系统。
联系——是实体间的相互关系。
联系的元数——与一个联系有关的实体集个数。
1:1联系——如果实体集E1中每个实体至多和实体集E2中一个实体有联系,反之亦然,那么实体集E1和E2的联系称为“一对一联系”,记为“1:1”。
1:N联系——如果实体集E1中的每个实体可以与实体集E2中的任意个(0个或多个)实体有联系,而E2中的每个实体至多和E1中的一个实体有联系,那么称E1对E2的联系是一对多联系,记作:“1:N ”。
M:N联系——如果实体集E1中的每个实体可以与实体集E2中的任意个(0个或多个)实体有联系,反之亦然,那么称E1和E2的联系是“多对多联系”,记作“M:N”。
数据模型——在数据库技术中,我们用数据模型的概念描述数据库的结构和语义,对现实世界的数据进行抽象。
根据数据抽象级别定义了四种模型:概念数据模型、逻辑数据模型、外部数据模型和内部数据模型。
概念模型——表达用户需求观点的数据全局逻辑结构的模型。
逻辑模型——表达计算机实现观点的DB全局逻辑结构的模型。
主要有层次、网状、关系模型等三种。
外部模型——表达用户使用观点的DB局部逻辑结构的模型。
内部模型——表达DB物理结构的模型。
层次模型——用树型(层次)结构表示实体类型及实体间联系的数据模型。
网状模型——用有向图结构表示实体类型及实体间联系的数据模型。
关系模型——是由若干个关系模式组成的集合。
万常选版数据库系统原理与设计第9章课后习题答案
USE ScoreDBGO--9.6 在学生成绩管理数据库ScoreDB中完成。
--(1) 在班级表Class中,分别使用列级和元组级约束保证班级人数classNum属性的取值在(0,50)之间。
--为避免误删Class表的数据,另建两表演示,演示后删除--列级约束CREATE TABLE Class1(classNo char(6) PRIMARY KEY, /*班级编号*/className varchar(30) NOT NULL, /*班级名称*/institute varchar(30) NOT NULL, /*所属学院*/grade smallint NOT NULL /*年级*/DEFAULT 0,classNum tinyint NULL /*班级人数*/CHECK(classNum >=0 AND classNum <= 50))--元组级约束CREATE TABLE Class2(classNo char(6) PRIMARY KEY, /*班级编号*/className varchar(30) NOT NULL, /*班级名称*/institute varchar(30) NOT NULL, /*所属学院*/grade smallint NOT NULL /*年级*/DEFAULT 0,classNum tinyint NULL, /*班级人数*/CONSTRAINT CK_Class_classNum CHECK(classNum >=0 AND classNum <= 50))--删除演示表DROP TABLE Class1DROP TABLE Class2GO--(2) 在学生表Student中,限制籍贯为上海或北京的学生的年龄必须在17岁以上。
--需要使用触发器CREATE TRIGGER Student_birthdayON StudentFOR INSERT,UPDATEASIF EXISTS(SELECT * FROM inserted WHERE YEAR(GETDATE())-YEAR(birthday)<17) ROLLBACKGO--(3) 对于某门课程,保证如果没有选修其先修课程,则不能选修该课程。
数据库第九章参考答案
第九章T-SQL基础P1641.从功能上划分,SQL分为哪4类?[难度↓]【解】SQL语句通常分成以下4类:数据查询语言数据操作语言数据定义语言数据控制语言2.NULL代表什么含义?将其与其他值进行比较会产生什么结果?如果数值型列中存在NULL,会产生什么结果?[难度↓]【解】在数据库中,NULL是一个特殊值,表示数值未知。
NULL不同于空字符或数字0,也不同于零长度字符串。
比较两个空值或将空值与任何其他数值相比均返回未知,这是因为每个空值均为未知。
空值通常表示未知、不可用或以后添加数据。
如果某个列上的空值属性为NULL,表示接受空值;空值属性为NOT NULL,表示拒绝空值。
如果数值型列中存在NULL,则在进行数据统计时就会产生不正确的结果。
3.使用T-SQL语句向表中插入数据应注意什么?[难度↓]【解】在使用T-SQL语句向表中插入数据时要注意以下几点:当向表中所有列都插入新数据时,可以省略列表名,但是必须保证VALUES 后的各数据项位置同表定义时的顺序一致。
要保证表定义时的非空列必须有值,即使这个非空列没有出现在插入语句中,也必须如此。
插入字符型和日期型值时,要加入单引号。
没有列出的数据类型应该具有以下属性之一:identity属性、timestamp 数据类型、具有NULL属性或者有一个默认值。
对于具有identity属性的列,其值由系统给出,用户不必往表中插入数据。
4.在SELECT语句中DISTINCT、ORDER BY、GROUP BY和HA VING子句的功能各是什么?[难度↓]【解】各子句的功能如下。
DISTINCT:查询唯一结果。
ORDER BY:使查询结果有序显示。
GROUP BY:对查询结果进行分组。
HA VING:筛选分组结果。
5.在一个SELECT语句中,当WHERE子句、GROUP BY子句和HA VING子句同时出现在一个查询中时,SQL的执行顺序如何?[难度↓↓]【解】其执行顺序如下:(1)执行WHERE子句,从表中选取行。
数据库系统原理参考答案
第一章习题参考答案1.名词解释:数据、数据库、数据库管理系统、数据库系统、关系数据库管理系统。
数据:用来记录或者标识事物本质特征的符号。
具体包括文本、图形、图像、音频、视频、动画等数据。
数据库:长期储存在计算机内的有组织的、统一的、共享的、结构化的、通用化的、综合性的数据的集合。
数据库管理系统:位于用户与操作系统之间,提供给用户实现数据库的定义、操纵和运行管理的数据管理软件,从而科学地组织和存储数据、高效地获取和维护数据。
数据库系统:在计算机系统中引入数据库后,由数据库、数据库管理系统、数据库应用系统、数据库设计员、数据库管理员和用户等构成的完整的计算机系统。
DBS的核心是数据库管理系统,DBMS是用户与数据库的接口关系数据库系统:支持关系数据库技术的数据库系统。
2.简述数据库管理系统的功能。
数据定义DDL;数据操纵DML;数据控制DCL(安全性、完整性、并发控制和数据恢复);数据接口;数据组织和存储;事务和运行管理等。
从而确保数据的安全、完整、并发和恢复。
3.简述数据库系统的组成和特点。
组成:DBS硬件(计算机硬件、数据库硬件和网络硬件等)、DBS软件(操作系统、DBMS、程序设计主语言、数据库专用开发工具和数据库应用系统等)和人员(数据库设计员、数据库分析员、数据库管理员、数据库程序员和用户)等组成。
特点:数据结构化组织、永久储存和统一管理;数据共享;冗余度小;独立性高;容易扩展等。
4.常用的数据模型有哪些?简述数据模型的三个要素。
类型:层次模型(最早);网状模型;关系模型(目前流行);面向对象模型(20世纪80年代引入OOP)。
要素:数据结构;数据操作;完整性约束。
5.简述DBA的职责。
决定数据库的信息内容和结构;决定数据库的存储结构和存取策略;定义数据的安全性和完整性;监控数据库的使用和运行;数据库的改进和重组重构。
6.简述数据库技术发展的三个基本阶段。
人工管理;文件系统;数据库系统7.试述文件系统与数据库系统的区别。
数据库系统原理(2018版)课后习题参考答案
选择题
A、D、D
填空题
数据库系统就是指在计算机中引入数据库技术之后得系统,包括数据库、数据库管理系统及相关实用工具、应用程序、数据库管理员与用户。
2、请简述早数据库管理技术中,与人工管理、文件系统相比,数据库系统得优点。
数据共享性高
数据冗余小
易于保证数据一致性
数据独立性高
可以实施统一管理与控制
减少了应用程序开发与维护得工作量
一对多联系:对于实体集A中得每个实体,实体集B中有N个实体与之联系,反之,对于实体集B中得每个实体,实体集A中最多只有一个实体与之联系。举例:班级与班级成员,每个班级对应多个班级成员,每个班级成员只对应一个班级。
多对多联系:对于实体集A中得每个实体,实体集B中有N个实体与之联系,反之,对于实体集B中得每个实体,实体集A中有M个实体与之联系。举例:授课班级与任课教师,每个班级对应多名任课教师,每个任课教师也对应多个授课班级。
答案仅供参考
第一章 数据库系统概述
选择题
B、B、A
简答题
1、请简述数据,数据库,数据库管理系统,数据库系统得概念。 P27
数据就是描述事物得记录符号,就是指用物理符号记录下来得,可以鉴别得信息。
数据库即存储数据得仓库,严格意义上就是指长期存储在计算机中得有组织得、可共享得数据集合。
数据库管理系统就是专用于建立与管理数据库得一套软件,介于应用程序与操作系统之间。
建立在严格得数学概念得基础上
概念单一,统一用关系表示实体与实体之间得联系,数据结构简单清晰,用户易懂易用
存取路径对用户透明,具有更高得数据独立性、更好得安全保密性。
第二章 关系数据库
选择题
C、C、D
简答题
数据库系统原理教程课后习题及答案(第九章)
第9章数据库恢复技术1.试述事务的概念及事务的4 个特性。
答:事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。
事务具有4 个特性:原子性(Atomicity )、一致性(consistency )、隔离性( Isolation )和持续性(Durability )。
这4 个特性也简称为ACID 特性。
原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
隔离性:一个事务的执行不能被其他事务干扰。
即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持续性:持续性也称永久性(Perfnanence ) ,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
接下来的其他操作或故障不应该对其执行结果有任何影响。
2 .为什么事务非正常结束时会影响数据库数据的正确性,请列举一例说明之。
答:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
例如某工厂的库存管理系统中,要把数量为Q 的某种零件从仓库1 移到仓库2 存放。
则可以定义一个事务T , T 包括两个操作;Ql = Ql 一Q , Q2= Q2 + Q。
如果T 非正常终止时只做了第一个操作,则数据库就处于不一致性状态,库存量无缘无故少了Q 。
3 .数据库中为什么要有恢复子系统?它的功能是什么?答:因为计算机系统中硬件的故障、软件的错误、操作员的失误以及恶意的破坏是不可避免的,这些故障轻则造成运行事务非正常中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中全部或部分数据丢失,因此必须要有恢复子系统。
数据库原理课后习题及解答(常用版)
数据库原理课后习题及解答(常用版)(可以直接使用,可编辑完整版资料,欢迎下载)《数据库原理》课后习题及解答课后习题:第一章第二章第三章第四章第五章第六章第七章第八章第九章习题答案:第一章第二章第三章第四章第五章第六章第七章第八章第九章第一章概论1.试解释下列术语:数据库;数据库管理系统;数据库系统2.试述数据库管理系统的组成内容。
3.试比较文件系统与数据库系统的异同。
4.什么叫数据的物理独立性与逻辑独立性?并说明它的重要性。
5.试述数据库系统的优点。
6.什么叫数据的冗余与数据的不一致性?7.什么叫数据库管理员?他的主要工作是什么?8.试述数据库系统发展的几个阶段。
返回第一章答案第二章数据模型1.什么叫数据库模型,它分哪几种类型?2.试区别数据模型与数据模式。
3.什么叫数据模式,它分哪三级?4.试述数据模型四个世界的基本内容。
5.试介绍E-R模型,EE-R模型及面向对象模型、谓词模型,并各举一例说明之。
6.层次网状模型有什么特点?并各举一例说明之。
7.试比较层次、网状、关系模型之优缺点。
8.试说明关系模型的基本结构与操作。
9.目前流行的关系型数据库管理系统,有哪些你比较熟悉,试介绍其特点。
10.你认为“数据模型”在整个数据库领域中是否有重要作用和地位,试详细说明之。
11.一图书馆借阅书刊,请你画出书刊、读者及借阅三者间的E-R模型。
12.一人事档案中,有干部、职工,干部又有高级干部与一般干部,请用EE-R模型画出他们之间关系。
13.试述物理模型的主要内容。
14.试叙述四个世界的转化关系。
15.请你比较四种数据模型的异同。
返回第二章答案第三章关系数据库系统1.试述关系数据库系统的优点。
2.试述关系型的12条标准,并说明FOXBASE为何是半关系型的。
3.关系代数与关系演算的表示能力是否相同?试证明之。
4.从关系模型的数学表示中,你是否认为网状与层次模型也可以用数学方法表示?试说明理由。
5.设有如图3-1所示的医院组织。
数据库系统原理版课后习题参考答案
数据库系统原理版课后习题参考答案答案仅供参考第一章数据库系统概述选择题B、B、A简答题1.请简述数据,数据库,数据库管理系统,数据库系统的概念。
P27数据是描述事物的记录符号,是指用物理符号记录下来的,可以鉴别的信息。
数据库即存储数据的仓库,严格意义上是指长期存储在计算机中的有组织的、可共享的数据集合。
数据库管理系统是专门用于建立和管理数据库的一套软件,介于应用程序和操作系统之间。
数据库系统是指在计算机中引入数据库技术之后的系统,包括数据库、数据库管理系统及相关实用工具、应用程序、数据库管理员和用户。
2.请简述早数据库管理技术中,与人工管理、文件系统相比,数据库系统的优点。
数据共享性高数据冗余小易于保证数据一致性数据独立性高可以实施统一管理与控制减少了应用程序开发与维护的工作量3.请简述数据库系统的三级模式和两层映像的含义。
P31答:数据库的三级模式是指数据库系统是由模式、外模式和内模式三级工程的,对应了数据的三级抽象。
两层映像是指三级模式之间的映像关系,即外模式/模式映像和模式/内模式映像。
4.请简述关系模型与网状模型、层次模型的区别。
P35使用二维表结构表示实体及实体间的联系建立在严格的数学概念的基础上概念单一,统一用关系表示实体和实体之间的联系,数据结构简单清晰,用户易懂易用存取路径对用户透明,具有更高的数据独立性、更好的安全保密性。
.第二章关系数据库选择题C、C、D简答题1.请简述关系数据库的基本特征。
P48答:关系数据库的基本特征是使用关系数据模型组织数据。
2.请简述什么是参照完整性约束。
P55答:参照完整性约束是指:若属性或属性组F是基本关系R的外码,与基本关系S的主码K相对应,则对于R中每个元组在F上的取值只允许有两种可能,要么是空值,要么与S中某个元组的主码值对应。
3.请简述关系规范化过程。
答:对于存在数据冗余、插入异常、删除异常问题的关系模式,应采取将一个关系模式分解为多个关系模式的方法进行处理。
数据库原理教程习题答案(全)
0000000000第1章数据库系统概述习题参考答案税务局使用数据库存储纳税人(个人或公司)信息、纳税人缴纳税款信息等。
典型的数据处理包括纳税、退税处理、统计各类纳税人纳税情况等。
银行使用数据库存储客户基本信息、客户存贷款信息等。
典型的数据处理包括处理客户存取款等。
超市使用数据库存储商品的基本信息、会员客户基本信息、客户每次购物的详细清单。
典型的数据处理包括收银台记录客户每次购物的清单并计算应交货款。
1.2 DBMS是数据库管理系统的简称,是一种重要的程序设计系统。
它由一个相互关联的数据集合和一组访问这些数据的程序组成。
数据库是持久储存在计算机中、有组织的、可共享的大量数据的集合。
数据库中的数据按一定的数据模型组织、描述和存储,可以被各种用户共享,具有较小的冗余度、较高的数据独立性,并且易于扩展。
数据库系统由数据库、DBMS(及其开发工具)、应用系统和数据库管理员组成。
数据模型是一种形式机制,用于数据建模,描述数据、数据之间的联系、数据的语义、数据上的操作和数据的完整性约束条件。
数据库模式是数据库中使用数据模型对数据建模所产生设计结果。
对于关系数据库而言,数据库模式由一组关系模式构成。
数据字典是DBMS维护的一系列内部表,用来存放元数据。
所谓元数据是关于数据的数据。
1.3 DBMS提供如下功能:(1)数据定义:提供数据定义语言DDL,用于定义数据库中的数据对象和它们的结构。
(2)数据操纵:提供数据操纵语言DML,用于操纵数据,实现对数据库的基本操作(查询、插入、删除和修改)。
(3)事务管理和运行管理:统一管理数据、控制对数据的并发访问,保证数据的安全性、完整性,确保故障时数据库中数据不被破坏,并且能够恢复到一致状态。
(4)数据存储和查询处理:确定数据的物理组织和存取方式,提供数据的持久存储和有效访问;确定查询处理方法,优化查询处理过程。
(5)数据库的建立和维护:提供实用程序,完成数据库数据批量装载、数据库转储、介质故障恢复、数据库的重组和性能监测等。
数据库系统l试题库及答案 第9章 查找
第9章查找9.1知识点:静态查找表一、填空题1.在数据的存放无规律而言的线性表中进行检索的最佳方法是。
2.查找表是由构成的集合。
3.若对查找表只做“查询某个特定的数据元素是否在查找表中”和“查询某个特定的数据元素的各种属性”操作,则称此类查找表为。
若在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,则称此类查找表为。
4.在n个记录的有序顺序表中进行折半查找,最大的比较次数为。
5.是顺序查找的一种改进方法,又称索引顺序查找,具体实现为将一个主表分成n个子表,要求子表之间元素是按,而子表中元素可以无序的,用每个子表最大关键字和指示块中第一个记录在表中位置建立。
6.分块查找的时间复杂度是。
7.顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为次;当使用监视哨时,若查找失败,则比较关键字的次数为次。
8.由于查找运算的主要运算是关键字的比较,所以通常把______________作为衡量一个查找算法效率优劣的标准。
它的计算公式为________________________________________。
二、选择题1.()在表长为n的链表中进行顺序查找,它的平均查找长度为()。
A. ASL=nB. ASL=(n+1)/2C. ASL=+1D. ASL≈log2(n+1)-12.()采用折半查找方法查找长度为n的线性表时,平均时间复杂度为()。
A.O(n2)B.O(nlogn)C.O(n)D.O(logn)3.()折半查找有序表(4,6,10,12,20,30,50,70,88,100)。
若查找表中元素58,则它将依次与表中()比较大小,查找结果是失败。
A.20,70,30,50 B.30,88,70,50 C.20,50 D.30,88,504.()有序线性表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表中与k相等的元素,在查找不成功的情况下,最多需要检索()次。
数据库第九章
a f1 b h2
a f3
c f4
11
函数依赖
函数依赖:一种完整性约束,表示特定的属性值之间的关系,可以用来 判断模式规范化和建议改进
例,考虑r(A,B)及其下列实例r
AB 14 15 37 对此实例,A B不成立,但B A成立 ∵若B属性值确定了,则A属性值也唯一确定了。于是有 B → A
由于包含n个元素的集合含有个2n子集,因此共有2nX2n个可能的函数依 赖
后面会介绍完成此任务的另一过程
22
属性集的闭包
如何判断集合是否为超码
一种方法是:计算F+ ,在F+中找出所有 i ,检查{ 1 2 3 … }= R。 但是这么做开销很大,因为F+可能很大
另一种方法是:计算的闭包
10
函数依赖
设R是一个关系模式,且有属性集 R, R
函数依赖
借用了数学上的函数概念: x → f(x)
在R上成立当且仅当对任意合法关系r(R),若r的任意两条元组t1和t2
在属性集上的值相同,则他们在属性集上的值也相同。即,
t1[] = t2[] t1[] = t2[]
AG I:用G增补A C得AG CG,再由CG I根据传递规则得到
CG HI:由CG H和CG I,可根据函数依赖的定义导出“并规则”
得到,或增补CG I得到CG CGI,增补CG H得到CGI HI,再利
用传递规则得到
20
Armstrong公理的补充定律
使用空值(null):存储一个不知道所在系的教师信息,可以使用空值表 示dept_name, building, budget数据,但是空值难以处理
数据库原理与应用第9章答案解析主编肖海蓉、任民宏
数据库原理与应用第9章答案解析主编肖海蓉、任民宏第9章数据库的备份与恢复9.1数据库的备份9.1.1备份的相关概念9.1.2SQLServer2012数据备份方式9.1.3SQLServer2012备份设备的管理9.1.4SQLServer2012数据库备份9.2数据库的恢复9.2.1SQLServer2012数据恢复模型9.2.2SQLServer2012数据库恢复9.2.3SQLServer2012数据库的分离和附加9.3数据的转换9.3.1SQLServer2012数据导出9.3.2SQLServer2012数据导入本章小结习题9第9 章数据库的备份与恢复课后习题参考答案1、简答题(1)简述SQL Server 2012 数据备份方式,并说明它们之间的区别。
答:SQL Server 2012 中把数据备份分为数据库备份、文件及文件组备份两大类。
①数据库备份分为完整备份、差异备份、事务日志备份。
其中完整备份是将整个数据库的所有数据及数据库对象完全复制到备份文件中;增量备份也称为差异备份,是完整备份的补充;这种备份方式须首先执行过一次完整备份,之后每次增量备份仅是备份最近一次完全备份以后数据库发生变化的数据;事务日志备份即备份发生在数据库上的事务,只备份事务日志中的内容。
完整备份比较容易理解,即备份一个完整数据库的当前所有内容,日志备份和增量备份都是在数据库完整备份的基础上备份后期数据库变动更新的内容,二者的区别是各自备份的起点不同。
②文件与文件组备份;若在创建数据库时建立了多个数据库文件或文件组,则可以使用文件和文件组备份方式。
一般可以将数据库文件组和文件存储在不同的备份设备上,通常应用于经常更新的超大型数据库或分布在多个文件的数据库,是比较复杂的备份。
(2)简述如何创建备份设备。
答:备份设备可以通过SQL Server Management Studio 或T-SQL 语言来实现。
1)使用SQL Server Management Studio 创建备份设备;①在对象资源管理器中,展开“服务器名称”→“服务器对象”→“备份设备”节点,右击“备份设备”节点,出现备份设备快捷菜单。
北理珠数据库系统概论习题 第九章
第九章一问答题试题1 满分值:10.0分状态:未答实际得分:分试题:试述查询处理的基本过程。
[参考答案]RDBMS查询处理过程:(1). 查询分析;对查询语句进行扫描、词法分析和语法分析,从查询语句中识别出语言符号,进行语法检查和语法分析。
(2). 查询检查;根据数据字典对合法的查询语句进行语义检查,根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查,检查通过后把SQL查询语句转换成等价的关系代数表达式,RDBMS一般都用查询树(语法分析树)来表示扩展的关系代数表达式把数据库对象的外部名称转换为内部表示。
(3). 查询优化;查询优化:选择一个高效执行的查询处理策略。
(4). 查询执行;依据优化器得到的执行策略生成查询计划,代码生成器(Code Generator)生成执行查询计划的代码。
[我的答案]试题2 满分值:10.0分状态:未答实际得分:分试题:什么是代数优化,什么是物理优化?[参考答案]通过对关系代数表达式的等价变换来提高查询效率,即有选择和连接操作时,先做选择操作,这样参加连接的元组就可以大大减少,这是代数优化。
物理优化:SC表的选择操作算法有全表扫描和索引扫描2种方法,经过初步估算,索引扫描方法较优,对于Student和SC表的连接,利用 Student表上的索引,采用index join代价也较小,这就是物理优化。
物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划。
[我的答案]试题3 满分值:10.0分状态:未答实际得分:分试题:试述查询优化的一般步骤。
[参考答案]各个关系系统的优化方法不尽相同,大致的步骤可以归纳如下:( l )把查询转换成某种内部表示,通常用的内部表示是语法树。
( 2 )把语法树转换成标准(优化)形式。
即利用优化算法,把原始的语法树转换成优化的形式。
( 3 )选择低层的存取路径。
( 4 )生成查询计划,选择代价最小的。
试题:试述查询优化的一般准则。
数据库系统与应用课后习题答案
第九章数据库应用设计方法1.试述数据库设计的基本过程。
答:数据库设计过程通常包括六个阶段: ( l )需求分析; ( 2 )概念结构设计; ( 3 )逻辑结构设计及优化; ( 4 )数据库物理设计; ( 5 )数据库实现; ( 6 )数据库运行和维护。
这是一个完整的实际数据库及其应用系统的设计过程。
设计一个完善的数据库应用系统往往是上述六个阶段的不断反复。
2.简述需求分析的步骤。
答:一般来说,需求分析工作可分为需求调研、需求分析、需求规范说明书编制和需求验证4个步骤。
1)需求调研是通过了解用户的组织机构情况、了解用户各部门的业务活动情况、确定系统边界等工作完成用户需求的收集、调查。
2)需求分析。
完成对用户活动的调查分析后,还需要进一步分析和抽象用户的需求,使之转换为后续各设计阶段可用的形式。
具体来说就是用户对数据库应用系统的各种需求,包括用户对数据信息存储的需求、数据信息的处理需求、业务数据流需求等。
需求分析的方法主要包括原型化方法、结构化方法及数据流分析方法等。
3)需求规范说明书编制。
需求规范说明书阐述数据库应用系统所必须提供的功能和性能要求,以及运行的实际约束条件。
需求规范说明书以书面方式记录用户与开发方所达成的产品需求协议条款,不仅是用户对最终产品的接受基础,也是开发方在进行设计、实现与测试运行的规范。
4)需求验证。
需求验证主要包括有效性验证、一致性验证和完备性验证。
3.数据字典的内容是什么?答:数据字典存放了系统所用到的数据信息,通常数据字典包含了5个基本组成部分:数据项、数据结构、数据流、数据存储和处理过程。
1)数据项。
数据项记录了数据对象的基本信息,是不可再分的基本数据单位,描述了数据的静态特性。
数据项包含了对数据对象的区分数据对象完整性、一致性约束的描述。
2)数据结构。
数据结构反映了数据之间的组合关系,也可以是由多个数据结构的复合。
3)数据流。
数据流是对数据动态特性的描述,表示了数据结构沿着系统的事务和处理过程中的传输流向。
(完整版)数据库系统基础教程第九章答案
9.3.1a)In the following, we use macro NOT_FOUND as defined in the section.void closestMatchPC() {EXEC SQL BEGIN DECLARE SECTION;char manf, SQLSTATE[6];int targetPrice, /* holds price given by user */float tempSpeed, speedOfClosest;char tempModel[4], modelOfClosest[4];int tempPrice, priceOfClosest;/* for tuple just read from PC & closest price found so far */EXEC SQL END DECLARE SECTION;EXEC SQL DECLARE pcCursor CURSOR FORSELECT model, price, speed FROM PC;EXEC SQL OPEN pcCursor;/* ask user for target price and read the answer into variabletargetPrice *//* Initially, the first PC is the closest to the target price.If PC is empty, we cannot answer the question, and so abort. */EXEC SQL FETCH FROM pcCursorINTO :modelOfClosest, :priceOfClosest, :speedOfClosest;if(NOT_FOUND) /* print message and exit */ ;while(1) {EXEC SQL FETCH pcCursor INTO :tempModel, :tempPrice,:tempSpeed;if(NOT_FOUND) break;if(/*tempPrice closer to targetPrice than is priceOfClosest */){modelOfClosest = tempModel;priceOfClosest = tempPrice;speedOfClosest = tempSpeed;}}/* Now, modelOfClosest is the model whose price is closest totarget. We must get its manufacturer with a single-row select */EXEC SQL SELECT makerINTO :manfFROM ProductWHERE model = :modelOfClosest;printf("manf=%s, model=%d, speed=%d\n",manf, modelOfClosest, speedOfClosest);EXEC SQL CLOSE CURSOR pcCursor;}b)void acceptableLaptop() {EXEC SQL BEGIN DECLARE SECTION;int minRam, minHd, minScreen; /* given by user */float minSpeed;char model[4], maker,float speed;int ram, hd, screen, price;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE query1 FROM‘ SELECT model, speed, ram, hd, screen, price, maker FROM Laptop l, Product pWHERE speed >= ?AND ram >= ? ANDhd >= ? ANDscreen >= ? ANDl.model = p.model’EXEC SQL DECLARE cursor1 CURSOR FOR query1;/* ask user for minimum speed, ram, hd size, and screen size */EXEC SQL OPEN cursor1 USING :minSpeed, :minRam, :minHd, :minScreen;while(!NOT_FOUND) {EXEC SQL FETCH cursor1 INTO:model, :speed, :ram, :hd, :screen, :price, :maker;if(FOUND){printf("maker:%s, model:%d, \nspeed:%.2f, ram:%d, hd:%d, screen:%d, price:%d\n",maker, model, speed, ram, hd, screen, price);}}EXEC SQL CLOSE CURSOR cursor1;}c)void productsByMaker() {EXEC SQL BEGIN DECLARE SECTION;char maker, model[4], type[10], color[6];float speed;int ram, hd, screen, price;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE query1 FROM‘ SELECT * FROM PCWHERE model IN (SELECT model FROM ProductWHERE maker = ? ANDtype =‘ pc’ );EXEC SQL PREPARE query2 FROM‘ SELECT * FROM LaptopWHERE model IN (SELECT model FROM ProductWHERE maker = ? ANDtype =‘ laptop’ );EXEC SQL PREPARE query3 FROM‘ SELECT * FROM PrinterWHERE model IN (SELECT model FROM ProductWHERE maker = ? ANDtype =‘ printer’ );EXEC SQL DECLARE cursor1 CURSOR FOR query1;EXEC SQL DECLARE cursor2 CURSOR FOR query2;EXEC SQL DECLARE cursor3 CURSOR FOR query3;/* ask user for manufacturer */Printf(“ maker:%s n” , ma ker);/* get PCs made by the manufacturer */EXEC SQL OPEN cursor1 USING :maker;Printf( “ product type: PC n” );while(!NOT_FOUND) {EXEC SQL FETCH cursor1 INTO:model, :speed, :ram, :hd, :price;if(FOUND){n” , model, speed, ram, hd, price);}}/* get Laptops made by the manufacturer */EXEC SQL OPEN cursor2 USING :maker;Printf(“ product type: Laptop n” );while(!NOT_FOUND) {EXEC SQL FETCH cursor2 INTO:model, :speed, :ram, :hd, :screen, :price;if(FOUND){printf("model:%d, speed:%.2f, ram:%d, hd:%d, screen:%d,price:%d\n", model, speed, ram, hd, screen, price);}}/* get Printers made by the manufacturer */EXEC SQL OPEN cursor3 USING :maker;Printf(“ product type: Printer n”);while(!NOT_FOUND) {EXEC SQL FETCH cursor3 INTO:model, :color, :type, :price;if(FOUND){printf("model:%d, color:%s, type:%s, price:%d\n",model, color, type, price);}}EXEC SQL CLOSE CURSOR cursor1;EXEC SQL CLOSE CURSOR cursor2;EXEC SQL CLOSE CURSOR cursor3;}d)void withinBudget() {EXEC SQL BEGIN DECLARE SECTION;int total_budget, rest_budget, pc_price, printer_price;char pc_model[4], printer_model[4], color[6];float min_speed;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE query1 FROM‘ SELECT model, price FROM PCWHERE speed >= ? AND price <= ?ORDER BY price’;EXEC SQL PREPARE query2 FROM‘ SELECT model, price FROM PrinterWHERE price <= ? AND color = ?ORDER BY price’;EXEC SQL DECLARE cursor1 CURSOR FOR query1;EXEC SQL DECLARE cursor2 CURSOR FOR query2;/* ask user for budget & the minimum speed of pc *//* get the cheapest PC of the minimum speed */EXEC SQL OPEN cursor1 USING :min_speed, :total_budget;EXEC SQL FETCH cursor1 INTO :pc_model, :pc_price;if (NOT_FOUND)Printf( “ no pc f n” );else{Printf( “ pc model: %s n” , pc_model);}/* get Printer within the budget–pc_price;*/ rest_budget = total_budgetcolor = “ true ”;EXEC SQL OPEN cursor2 USING :rest_budget, :color;EXEC SQL FETCH cursor2 INTO :printer_model;if(NOT_FOUND) {EXEC SQL CLOSE CURSOR cursor2;color =“ false”;EXEC SQL OPEN cursor2 USING :rest_budget, :color;if(NOT_FOUND)n” );printf(“ no printer found within the budgetelse {EXEC SQL FETCH cursor2 INTO :printer_model;printf(“ printer model: %s n” , printer_model);}}else {printf( “ printer model: %s n” , printer_model);}EXEC SQL CLOSE CURSOR cursor1;EXEC SQL CLOSE CURSOR cursor2;}e)void newPCproduct() {EXEC SQL BEGIN DECLARE SECTION;char pmaker, pmodel[4], ptype[6];float pspeed;int pram, phd, pscreen, pprice;int pcount;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE stmt1 FROM‘ SELECT COUNT(*) INTO :countFROM PCWHERE MODEL = ?;EXEC SQL PREPARE stmt2 FROM‘ INSERT INTO Product VALUES(?, ?, ?) ’;EXEC SQL PREPARE stmt3 FROM‘ INSERT INTO PC VALUES(?, ?, ?, ?, ?) ’;/* ask user for manufacturer, model, speed, RAM, hard-disk,& price of a new PC*/EXEC SQL EXECUTE stmt1 USING :pmodel;IF (count > 0)Printf( “ Warnning: The PC model already exists n” );ELSE{EXEC SQL EXECUTE stmt2 USING :pmaker, :pmodel, :ptype;EXEC SQL EXECUTE stmt3 UINGNG :pmodel, :pspeed, :pram,:phd, :pprice }}9.3.2a)void largestFirepower() {EXEC SQL BEGIN DECLARE SECTION;char cclass[20], maxFirepowerClass[20];int cnumGuns, cbore;float firepower, maxFirepower;EXEC SQL END DECLARE SECTION;EXEC SQL DECLARE cursor1 CURSOR FORSELECT class, numGuns, bore FROM Classes;EXEC SQL OPEN cursor1;EXEC SQL FETCH FROM cursor1 INTO :cclass, :cnumGuns, :cbore;if(NOT_FOUND) /* print message and exit */ ;maxFirepower = cnumGuns * (power (cbore, 3));strcpy(maxFirepowerClass, cclass);while(1) {EXEC SQL FETCH cursor1 INTO :cclass, :cnumGuns, :cbore;if(NOT_FOUND) break;firepower = cnumGuns * (power (cbore, 3));if( firepower > maxFirepower ){maxFirepower = firepower;strcpy(maxFirepowerClass, cclass);}}printf("Class of maximum firepower :%s\n", maxFirepowerClass);EXEC SQL CLOSE CURSOR cursor1;}b)void getCountry() {EXEC SQL BEGIN DECLARE SECTION;char ibattle[20], iresult[10], ocountry[20];char stmt1[200], stmt2[200];EXEC SQL END DECLARE SECTION;strcpy(stmt1,“ SELECT COUNTRY FROM Classes CWHERE C.class IN (SELECT S.class FROM Ships SWHERE IN (SELECT ship FROM OutcomesWHERE battle = ?))” );Strcpy(stm2,“ SELECT country FROM ClassesWHERE class = ( SELECT MAX(COUNT(class))FROM Ships s, Outcomes oWHERE = s.ship ANDs.result =‘ ?’ )” );EXEC SQL PREPARE query1 FROM stmt1;EXEC SQL PREPARE query2 FROM stmt2;EXEC SQL DECLARE cursor1 CURSOR FOR query1;EXEC SQL DECLARE cursor2 CURSOR FOR query2;/* ask user for battle *//* get countries of the ships involved in the battle */EXEC SQL OPEN cursor1 USING :ibattle;while(!NOT_FOUND) {EXEC SQL FETCH cursor1 INTO :ocountry;if(FOUND)n” , ocoutry);}EXEC SQL CLOSE CURSOR cursor1;/* get the country with the most ships sunk */strcpy(iresult,“ sunk” );EXEC SQL OPEN cursor2 USING :iresult;/* loop for the case there ’ s the same max# of ships sunk */While(!NOT_FOUND) {EXEC SQL FETCH cursor2 INTO :ocountry;If(FOUND)Printf(}/* get the country with the most ships damaged */strcpy(iresult, “ damaged ” ); EXEC SQL OPEN cursor2 USING :iresult;/* loop for the case there ’ s the same max# of ships damaged */While(!NOT_FOUND) {EXEC SQL FETCH cursor2 INTO :ocountry;If(FOUND)Printf(}} c)void addShips() {EXEC SQL BEGIN DECLARE SECTION; char iclass[20], itype[3], icontry[20], iship[20]; int inumGuns, ibore, idisplacement, ilaunched; char stmt1[100], stmt2[100]; EXEC SQL END DECLARE SECTION;strcpy(stmt1,“ INSERT INTO Classes VALUES (?, ?, ?, ?, ?, ?)” );strcpy(stmt2,“ INSERT INTO Ships VALUES (?, ?, ?)” );/* ask user for a class and other info for Classes table */EXEC SQL EXECUTE IMMEDATE :stmt1USING :iclass, :itype, :icontry,:inumGuns, :ibore, :idisplacement;/* ask user for a ship and launched */WHILE(there_is_input){“ country with the most ships damaged: %s, ocountry);“ country with the most ships sunk: %s, ocountry);EXEC SQL EXECUTE IMMEDATE :stmt2USING :iship, :iclass, ilaunched;/* ask user for a ship and launched */}}d)void findError() {EXEC SQL BEGIN DECLARE SECTION;char bname[20], bdate[8], newbdate[8];char sname[20], lyear[4], newlyear[4];char stmt1[100], stmt2[100];EXEC SQL END DECLARE SECTION;strcpy(stmt1, strcpy(stmt2, “ UPDATE Battles SET date = ? WHERE name = ?“ UPDATE Ships SET launched = ? WHERE name = ?” );” );EXEC SQL DECLARE C1 CURSOR FORSelect , b.date, , unchedFROM Battles b, Outcomes o, Ships sWHERE = o.battle ANDo.ship = ANDYEAR(b.date) < unched;EXEC SQL OPEN C1;while(!NOT_FOUND) {EXEC SQL FETCH C1 INTO :bname, :bdate, :sname, :lyear;/* prompt user and ask if a change is needed */if(change_battle){/* get a new battle date to newbdate */EXEC SQL EXECUTE IMMEDATE :stmt1USING :bname, :newbdate;}if(change_ship){/* get a new launched year to newlyear */EXEC SQL EXECUTE IMMEDATE :stmt2USING :sname, :newlyear;}}}9.4.1a)CREATE FUNCTION PresNetWorth(studioName CHAR[15]) RETURNS INTEGER DECLARE presNetWorth INT;BEGINSELECT netWorthINTO presNetWorthFROM Studio, MovieExecWHERE = studioName AND presC# = cert#;RETURN(presNetWorth);END;b)CREATE FUNCTION status(person CHAR(30), addr CHAR(255)) RETURNS INTEGERDECLARE isStar INT;DECLARE isExec INT;BEGINSELECT COUNT(*)INTO isStarFROM MovieStarWHERE = person AND MovieStar.address = addr;SELECT COUNT(*)INTO isExecFROM MovieExecWHERE = person AND MovieExec.address = addr;IF isStar + isExec = 0 THEN RETURN(4) ELSE RETURN(isStar +2*isExec)END IF;END;c)CREATE PROCEDURE twoLongest(IN studio CHAR(15),OUT longest VARCHAR(255),OUT second VARCHAR(255))DECLARE t VARCHAR(255);DECLARE i INT;DECLARE Not_Found CONDITION FOR SQLSTATE = '02000';DECLARE MovieCursor CURSOR FORSELECT title FROM Movies WHERE studioName = studioORDER BY length DESC;BEGINSET longest = NULL;SET second = NULL;OPEN MovieCursor;SET i = 0;mainLoop: WHILE (i < 2) DOFETCH MovieCursor INTO t;IF Not_Found THEN LEAVE mainLoop END IF;SET i = i + 1;END WHILE;CLOSE MovieCursor;END;d)CREATE PROCEDURE earliest120mMovie(IN star CHAR(30),OUT earliestYear INT)DECLARE Not_Found CONDITION FOR SQLSTATE = '02000'; DECLARE MovieCursor CURSOR FORSELECT MIN(year) FROM MoviesWHERE length > 120 ANDtitle IN (SELECT movieTitle FROM StarsInWHERE starName = star);BEGINSET earliestYear = 0;OPEN MovieCursor;FETCH MovieCursor INTO earliestYear;CLOSE MovieCursor;END;e)CREATE PROCEDURE uniqueStar(IN addr CHAR(255),OUT star CHAR(30))BEGINSET star = NULL;IF 1 = (SELECT COUNT(*) FROM MovieStar WHERE address = addr) THENSELECT name INTO star FROM MovieStar WHERE address = addr; END;f)CREATE PROCEDURE removeStar(IN star CHAR(30))BEGINDELETE FROM Movies WHERE title IN(SELECT movieTitle FROM StarsIn WHERE starName = star); DELETE FROM StarsIn WHERE starName = star;DELETE FROM MovieStar WHERE name = star;END;9.4.2a)CREATE FUNCTION closestMatchPC(targetPrice INT) RETURNS CHAR DECLARE closestModel CHAR(4);DECLARE diffSq INT;DECLARE currSq INT;DECLARE m CHAR(4);DECLARE p INT;DECLARE Not_Found CONDITION FOR SQLSTATE '02000'; DECLARE PCCursor CURSOR FORSELECT model, price FROM PC;BEGINSET closestModel = NULL;SET diffSq = -1;OPEN PCCursor;mainLoop: LOOPFETCH PCCursor INTO m, p;IF Not_Found THEN LEAVE mainLoop END IF;SET currSq = (p - targetPrice)*(p - targetPrice);IF diffSq = -1 OR diffSq > currSqTHEN BEGINSET closestModel = m;SET diffSq = currSq;END IF;END LOOP;CLOSE PDCursor;RETURN(closestModel);END;b)CREATE FUNCTION getPrice(imaker CHAR(1), imodel CHAR(4))RETURNS INTEGERDECLARE ptype VARCHAR(10);DECLARE pprice INT;DECLARE Not_Found CONDITION FOR SQLSTATE '02000';BEGINSELECT type INTO ptype FROM ProductWHERE maker = imaker AND model = imodel;IF ptype =‘ pc’ THENSELECT price INTO pprice FROM PCWHERE model = imodel;ELSE IF ptype =‘ laptop’ THENSELECT price INTO pprice FROM LaptopWHERE model = imodel;ELSE IF ptype =‘ printer’ THENSELECT price INTO pprice FROM PrinterWHERE model = imodel;ELSEpprice = NULL;END IF;RETURN (pprice);END;c)CREATE PROCEDURE addPC(IN imodel INT,IN ispeed DECIMAL(3,2),IN iram INT,IN ihd INT,IN iprice INT)DECLARE Already_Exist CONDITION FOR SQLSTATE '02300';BEGININSERT INTO PC VALUES(imodel, ispeed, iram, ihd, iprice); WHILE (Already_Exist) DOSET imodel = imodel + 1;INSERT INTO PC VALUES(imodel, ispeed, iram, ihd, iprice); END WHILE;END;d)CREATE PROCEDURE getNumOfHigherPrice(IN iprice INT,OUT NumOfPCs INT,OUT NumOfLaptops INT,OUT NumOfPrinters INT)BEGINSET NumOfPCs = 0;SET NumOfLaptops = 0;SET NumOfPrinters = 0;SELECT COUNT(*) INTO NumOfPCs FROM PCWHERE price > iprice;SELECT COUNT(*) INTO NumOfLaptops FROM Laptop WHERE price > iprice;SELECT COUNT(*) INTO NumOfPrinters FROM PrinterWHERE price > iprice;END;9.4.3a)CREATE FUNCTION getFirepower(iclass VARCHAR(10)) RETURNS INTEGER DECLARE firepower INT;DECLARE nguns INT;DECLARE nbore INT;BEGINSELECT numGuns, bore INTO nguns, nbore FROM ClassesWHERE class = iclass;SET firepower = nguns * (nbore * nbore * nbore);RETURN(firepower);END;b)CREATE PROCEDURE twoCountriesInBattle(IN ibattle VARCHAR(20),OUT firstCountry VARCHAR(20),OUT secondCountry VARCHAR(20))DECLARE i INT;DECLARE ocountry VARCHAR(20);DECLARE classCursor CURSOR FORSELECT country FROM ClassesWHERE class IN(SELECT class FROM ShipsWHERE name IN(SELECT ship FROM OutcomesWHERE battle = ibattle));BEGINSET firstCountry = NULL;SET secondCountry = NULL;SET i = 0;IF 2 = (SELECT COUNT(*) count FROM ClassesWHERE class IN(SELECT class FROM ShipsWHERE name IN(SELECT ship FROM OutcomesWHERE battle = ibattle)))THENOPEN classCursor;WHILE (i < 2) DOFETCH classCursor INTO ocountry;IF (i = 0) THENSET firstCountry = ocountry;ELSESET secoundCountry = ocountry;END IF;END WHILE;END IF;CLOSE calssCursor;END;c)CREATE PROCEDURE addClass(IN iship VARCHAR(20),IN iclass VARCHAR(20),IN itype CHAR(2),IN icountry VARCHAR(20),IN inumGuns INT,IN ibore INT,IN idisplacement INT)BEGININSERT INTO Classes VALUES(iclass, itype, icountry,inumGuns, ibore, idisplacement); INSERT INTO Ships VALUES(iship, iclass, NULL);END;d)CREATE PROCEDURE checkLaunched(IN ship VARCHAR(20))DECLARE bname VARCHAR(20);BEGINIF EXIST (SELECT INTO bnameFROM Battles b, Outcomes o, Ships sWHERE = o.battle ANDo.ship = ANDYEAR(b.date) < unched)THENUPDATE Ships SET launced = 0 WHERE name = iship;UPDATE Battles SET date = 0 WHERE name = bname; END IF;END9.4.49.5.1a)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR manf, tempModel[4];SQLFLOAT tempSpeed;SQLINTEGER tempPrice;SQLINTEGER colInfo;Int targetPrice;char modelOfClosest[4];float speedOfClosest;int priceOfClosest;/* ask user for target price and read the answer into variabletargetPrice*/errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV. n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC. n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}SQLExecDirect(execStat, “ SELECT model, price, speed FROM PC ” , SQL_NTS);SQLBindCol(execStat, 1, SQL_CHAR, tempModel,sizeof(tempModel), &colInfo);SQLBindCol(execStat, 2, SQL_INTEGER, tempPrice,sizeof(tempPrice), &colInfo);SQLBindCol(execStat, 3, SQL_FLOAT, tempSpeed,sizeof(tempSpeed), &colInfo);priceOfClosest = NULL;while(SQLFetch(execStat) != SQL_NO_DATA) {if( /* the 1st fetch or tempPrice closer to targetPrice */modelOfClosest = tempModel;priceOfClosest = tempPrice;speedOfClosest = tempSpeed;}}/* Now, modelOfClosest is the model whose price is closest totarget. We must get its manufacturer with a single-row select*/if (priceOfClosest == NULL ) /* no data fetched *//* print error message and exit */SQLPrepare (execStat,“ SELECT maker FROM Product WHERE model = ? ” , SQL_NTS); SQLBindParameter(execStat, 1,⋯,modelOfClosest,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQLCHAR, &manf, sizeof(manf), &colInfo);/* print manf */b)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR model[4], maker;SQLFLOAT minSpeed;SQLINTEGER minRam, minHd, minScreen;SQLFLOAT speed;SQLINTEGER ram, hd, screen;SQLINTEGER colInfo;/* ask user for minimum speed, ram, hd size, and screen size */errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV. n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC. n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}SQLPrepare(execStat,“ SELECT model, speed, ram, hd, screen, price, maker“ FROM Laptop l, Product p”||“ WHERE speed >= ? AND ” ||“ ram >= ? AND”||“ hd >= ? AND”||“ screen >= ? AND”||“ l.model = p.model”,”||SQL_NTS);SQLBindParameter(execStat, 1, SQL_FLOAT, ⋯ , minSpeed, ⋯ ); SQLBindParameter (execStat, 2, SQL_INTEGER, ⋯ , minRam, ⋯ );SQLBindParameter (execStat, 3, SQL_ SQLBindParameter (execStat, 4, SQL_ INTEGER,INTEGER,⋯ , minHd, ⋯ );⋯ , minScreen, ⋯ );SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo); SQLBindCol(execStat, 2, SQL_FLOAT, speed,sizeof(speed), &colInfo);SQLBindCol(execStat, 3, SQL_INTEGER, ram,sizeof(ram), &colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, hd,sizeof(hd), &colInfo);SQLBindCol(execStat, 5, SQL_INTEGER, screen,sizeof(screen), &colInfo);SQLBindCol(execStat, 6, SQL_INTEGER, price,sizeof(price), &colInfo);SQLBindCol(execStat, 7, SQL_CHAR, maker,sizeof(maker), &colInfo);while(SQLFetch(execStat) != SQL_NO_DATA) {if( FOUND )/* print fetched info */}c)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR maker, model[4], type[10], color[6];SQLFLOAT speed;SQLINTEGER ram, hd, screen, price;SQLINTEGER colInfo;/* ask user for minimum speed, ram, hd size, and screen size */errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv); if(errCode1) {printf( ” Error for SQL_HANDLE_ENV. n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC.n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT.n” );exit(1);}/* get PCs made by the manufacturer */SQLPrepare(execStat,“ SELECT * FROM PC WHERE model IN ( ” ||“ SELECT model FROM Product ” ||“ WHERE maker = ? AND ” ||“ type = ‘ pc’”, SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, maker,⋯); SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo); SQLBindCol(execStat, 2, SQL_FLOAT, speed,sizeof(speed), &colInfo);SQLBindCol(execStat, 3, SQL_INTEGER, ram,sizeof(ram), &colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, hd,sizeof(hd), &colInfo);SQLBindCol(execStat, 5, SQL_INTEGER, price,sizeof(price), &colInfo);while(SQLFetch(execStat) != SQL_NO_DATA) {if( FOUND )/* print fetched info */}/* get Laptops made by the manufacturer */SQLPrepare(execStat,“ SELECT * FROM Laptop WHERE model IN ( ” ||“ SELECT model FROM Product ” ||“ WHERE maker = ? AND ” ||“ type = ‘ laptop ’”, SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, maker,⋯); SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo);SQLBindCol(execStat, 2, SQL_FLOAT, speed,sizeof(speed), &colInfo);SQLBindCol(execStat, 3, SQL_INTEGER, ram,sizeof(ram), &colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, hd,sizeof(hd), &colInfo);SQLBindCol(execStat, 5, SQL_INTEGER, screen,sizeof(screen), &colInfo);SQLBindCol(execStat, 6, SQL_INTEGER, price,sizeof(price), &colInfo);while(SQLFetch(execStat) != SQL_NO_DATA) {if( FOUND )/* print fetched info */}/* get Printers made by the manufacturer */SQLPrepare(execStat,“ SELECT * FROM Printer WHERE model IN (”||“ SELECT model FROM Product”||“ WHERE maker = ? AND ” ||“ type =‘printer’”,SQL_NTS);SQLBindPara meter(execStat, 1, SQL_CHAR,⋯, maker,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo);SQLBindCol(execStat, 2, SQL_CHAR, color, sizeof(color), $colInfo);SQLBindCol(execStat, 3, SQL_CHAR, type, sizeof(type), $colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, price, sizeof(price), &colInfo);d)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLINTEGER total_budget, rest_budget, pc_price, printer_price;SQLCHAR pc_model[4], printer_model[4], color[6];SQLFLOAT min_speed;errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV.n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC.n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}SQLPrepare(execStat,“SELECT model, price FROM PCWHERE speed >= ? AND price <= ? ORDERBY price ”,SQL_NTS);/* ask user for budget & the minimum speed of pc *//* get the cheapest PC of the minimum speed */SQLBindParameter(execStat, 1, SQL_FLOAT , ⋯ ,min_speed , ⋯ ); SQLBindParameter(execStat, 2, SQL_INTEGER, ⋯ , total_budget, ⋯ );SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, pc_model, sizeof(pc_model),&colInfo);SQLBindCol(execStat, 2, SQL_INGETER, pc_price,sizeof(pc_price),&colInfo);SQLFetch(execStat);if (NOT_FOUND) {p rintf(“no pc found within the budget n” );}else {p rintf( “ pc model: %s n” , pc_model);}/* get Printer within the budget */–pc_price;rest_budget = total_budgetcolor =“true”;SQLPrepare(execStat,“SELECT model, price FROM PrinterWHERE price <= ? AND color = ?ORDER BY price ” , SQL_NTS);SQLBindParameter(execStat, 1, SQL_INTEGER , ⋯ , rest_budget , ⋯ ); SQLBindParameter(execStat, 2, SQL_CHAR, ⋯ , color , ⋯ );SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, print_model,sizeof(print_model),&colInfo);SQLBindCol(execStat, 2, SQL_INGETER, print_price,sizeof(print_price),&colInfo);SQLFetch(execStat);if(NOT_FOUND) {color =“false”;SQLBindParameter(execStat, 1, SQL_INTEGER,⋯, rest_budget,⋯);SQLBindParameter(execStat, 2, SQL_CHAR,⋯, color,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, print_model,sizeof(print_model),&colInfo);SQLBindCol(execStat, 2, SQL_INGETER, print_price,sizeof(print_price),&colInfo);SQLFetch(execStat);if(NOT_FOUND)printf( “ no printer found within the budget n” );elseprintf( “ printer model: %s n” , printer_model);}elseprintf( “ printer model: %s n” , printer_model);}e)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR pmodel[4], pmaker, ptype[6];SQLFLOAT pspeed;SQLINTEGER pram, phd, pscreen, pprice, count;SQLINTEGER colInfo;/* ask user for minimum speed, ram, hd size, and screen size */errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV.n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}/* ask user for manufacturer, model, speed, RAM, hard-disk, *//* & price of a new PC */SQLPrepare(execStat,“ SELECT COUNT(*) FROM PC WHERE model = ?”, SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, pmodel,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_INTEGER, count, sizeof(count), &colInfo);SQLFetch(execStat);if (count >0){ Printf( “ Warnning: The PC model already exists n” ); }else {” , SQLPrepare(execStat,“ INSERT INTO Product VALUES(?, ?, ?)SQL_NTS);SQLBindParame ter(execStat, 1, SQL_CHAR,⋯, pmaker,⋯);SQLBindParameter(execStat, 2, SQL_CHAR,⋯, pmodel,⋯);SQLBindParameter(execStat, 3, SQL_CHAR,⋯, ptype,⋯); SQLExecute(execStat);” , SQLPrepare(execStat,“ INSERT INTO PC VALUES(?, ?, ?, ?, ?)SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, pmodel,⋯);SQLBindParameter(execStat, 2, SQL_FLOAT,⋯, pspeed,⋯);SQLBindParameter(execStat, 3, SQL_INTEGER,⋯, pram,⋯); SQLBindParameter(e xecStat, 4, SQL_INTEGER,⋯, phd,⋯);SQLBindParameter(execStat, 5, SQL_INTEGER,⋯, pprice,⋯); SQLExecute(execStat);}9.5.2a)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR cclass[20], maxFirepowerClass[20];SQLFLOAT firepower, maxFirepower;SQLINTEGER cnumGuns, cbore;。
数据库系统原理课后习题答案 人民邮电出版社
第1章绪论1 .试述数据、数据库、数据库系统、数据库管理系统的概念。
答:( l )数据(Data ) :描述事物的符号记录称为数据。
数据的种类有数字、文字、图形、图像、声音、正文等。
数据与其语义是不可分的。
解析在现代计算机系统中数据的概念是广义的。
早期的计算机系统主要用于科学计算,处理的数据是整数、实数、浮点数等传统数学中的数据。
现代计算机能存储和处理的对象十分广泛,表示这些对象的数据也越来越复杂。
数据与其语义是不可分的。
500 这个数字可以表示一件物品的价格是500 元,也可以表示一个学术会议参加的人数有500 人,还可以表示一袋奶粉重500 克。
( 2 )数据库(DataBase ,简称DB ) :数据库是长期储存在计算机内的、有组织的、可共享的数据集合。
数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
( 3 )数据库系统(DataBas 。
Sytem ,简称DBS ) :数据库系统是指在计算机系统中引入数据库后的系统构成,一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员构成。
解析数据库系统和数据库是两个概念。
数据库系统是一个人一机系统,数据库是数据库系统的一个组成部分。
但是在日常工作中人们常常把数据库系统简称为数据库。
希望读者能够从人们讲话或文章的上下文中区分“数据库系统”和“数据库”,不要引起混淆。
( 4 )数据库管理系统(DataBase Management sytem ,简称DBMs ) :数据库管理系统是位于用户与操作系统之间的一层数据管理软件,用于科学地组织和存储数据、高效地获取和维护数据。
DBMS 的主要功能包括数据定义功能、数据操纵功能、数据库的运行管理功能、数据库的建立和维护功能。
解析DBMS 是一个大型的复杂的软件系统,是计算机中的基础软件。
目前,专门研制DBMS 的厂商及其研制的DBMS 产品很多。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.1 名词解释
(1)OODBS:是指面向对象数据库系统,它既具数据库管理的基本功能,又能支持面向对象的数据模型。
(2)ORDBS:基于对象关系数据模型的DBS称为对象关系数据库系统(ORDBS)。
(3)平面关系模型:传统的关系模型称为“平面关系模型”,它要求关系模式具有第一范式(1NF)性质,关系具有规范化的结构。
也就是规定属性值是不可分解的,即不允许属性值具有复合结构(元组或关系)。
(4)嵌套关系模型:是从平面关系模型发展而成的。
它允许关系的属性值又可以是一个关系,而且可以出现多次嵌套。
嵌套关系突破了1NF的定义框架,是“非1NF关系”。
(5)复合对象模型:在嵌套关系模型上进一步放宽要求。
在关系定义上,集合与元组不再有交替出现的严格限制,此时的关系中,属性类型可以是基本数据类型、结构类型(元组类型)或集体类型(即关系类型)。
(6)数据的泛化/细化:是对概念之间联系进行抽象的一种方法。
当在较低层上的抽象表达了
与之联系的较高层上抽象的特殊情况时,就称较高层上抽象是较低层上抽象的"泛化",而较低层上抽象是较高层上抽象的"细化"。
(7)对象关系模型:在传统关系数据基础上,提供元组、数组、集合等更为丰富的数据类型及处理新数据类型操作的能力而形成的数据模型。
(注:传统关系模型只支持字符、数值、字串,布尔值等等基本数据类型及其处理功能)
(8)类型级继承性:当继承性发生在类型级时,子类型继承了超类型的属性。
也就是说,超类型所具有的属性,在子类上也具有。
(9)表级继承性:继承性也可发生在表级,(就是元组集合上发生继承),子表继承超表全部属性,超表中每个元组最多可以与子表中一个元组对应,而子表中的每个元组在超表中恰有一个元组对应,并在继承的属性值上具有相同的值。
(10)引用类型:数据类型可以嵌套定义,在嵌套引用时,不是引用对象本身,而是个用对象标识符(即指针),这种指针被称为引用类型。
(11)对象:客观世界中的实体经过抽象称为问题空间中的对象,它是对一组信息及其操作的描述。
(12)类:是具有相同的变量名和类型、相同的消息和使用方法的对象的集合。
(13)单重继承性:一个子类继承某一个超类的结构和特性,称为单重继承性。
(14)多重继承性:一个子类继承多个超类的结构和特性,称为多重继承性。
(15)对象标识:在面向对象语言中,对象标识是一个指针一级的概念,在对象创建的瞬间,由系统赋给每个对象一个“标识”,即系统内的一个唯一的指针,在对象生存期内,这个标识不可改变。
(16)对象包含:不同类的对象之间存在的包含关系称为对象包含。
包含是一种“一部分”(is part of)的联系。
(17)类继承层次图:表示类继承关系的图,由超类名、子类名和一组线条自上而下有序的表示。
(18)类包含层次图:表示对象包含关系的图,由一些具有包含关系的对象和线条自上而下表示(下方的对象为其连线所指上方对象的一部分)。
(19)持久数据:是指创建这些数据的程序运行终止后数据依然存在于系统之中。
数据库中的关系就是持久数据。
(20)持久对象:程序运行结束后,被保留下来的对象称为持久对象。
(21)持久指针:持久指针可看作是数据库中指向对象的指针。
持久化指针不像内存中的指针,它在程序执行后及数据重组后仍保持有效。
(22)持久化C++系统: 基于C++的持久化扩充的OODBS。
9.2 随着计算机应用领域的扩大,关系数据库系统不能适应哪些应用需要?
答:关系数据库不适应的应用需要有:
(1)多媒体数据。
(2)空间数据
(3)时态数据。
(4)复合对象。
9.3 什么是对象联系图?图中,椭园、小圆圈、单箭头(→),双箭头(→→),双线箭头(=>),双向箭头(←→)所表示的含义。
答:椭圆表示对象,小圆圈表示属性是基本数据类型,单箭头(→)表示函数值是单值,双箭头(→→)表示函数值是多值,双线箭头(=>)是泛化边,表示泛化/细化联系,双向箭头(←→)表示两个函数互逆。
9.5 子表和超表应满足哪两个一致性要求?
子表和超表应满足下列两个一致性要求:
(1)超表中每个元组最多可以与每个子表中的一个元组对应。
(2)子表中每个元组在超表中恰有一个元组对应,并在继承的属性上有相同的值。
9.6 继承性体现了数据间什么联系?试举例说明。
继承是" is a "(细化/泛化)联系。
比如卡车是车的子类,“卡车”“is a”“车”“卡车”和“车”之间存在继承性。
9.7 持久化语言和嵌入式SQL语言有什么区别?
持久化语言与嵌入式SQL语言的不同:
(1)格式转换对程序员透明;
(2)程序员可直接操纵持久数据。
(具体内容可参见教材P211)
9.8 在OO技术与DB技术相结合过程中,采取了哪两条不同的途径?
一条途径是在传统的关系模型基础上,提供复合数据类型,扩充SQL语言使之能处理新的数据结构。
这种模型称为对象关系模型,还不能说是严格意义上的面向对象数据模型。
但是用户容易接受,易于推广。
另一条途径是在OOPL C++基础上进行扩充,能操作持久数据,处理数据库,形成持久化C++系统,即OODBS。
但较难提供对说明性查询的支持,因此推广使用难度较大。