1、数据库原理及应用习题集参考答案一、简答题1什么是数据库管理系统 答:一种负责数据库的建立,操作,管理和维护的软件系统。 。2数据库系统有哪几种模式 分别用来描述什么 答:(1) 外模式 是用户的数据视图,用来描述数据的局部逻辑结构,是模式的子集。(2) 模式 是所有用户的公共数据视图,用来描述数据库中全体数据的全局逻辑结构和特征。(3) 内模式 又称存储模式,描述数据的物理结构及存储方式3什么是事务 事务有哪些特征 答:所谓 事务 是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。事务的特征:A 原子性,C 一致性,I 隔离性,D 持续性。4、POWER B
2、UILDER 中事务对象有何作用 答: PowerBuider 的 事务对象 是应用程序与数据库之间进行通信的桥梁,在应用程序初启时,系统自动创一个为 SQLCA(SQL Communication Area, SQL 通讯区) 的全局事务对象,该对象在应用程序的任何地方都可以访问应用程序与数据库的所有通信都需要通过事务对象来完成,除了直接使用系统的缺省事务对 SQLCA 外,开发人员也可以创建自己的事务对象。5、SQL SERVER 中 INSERTED 表和 DELETED 表有何用 答:触发器中用到两种特殊的表:删除表和插入表触发器中使用名为“deleted“和“inserted“来参照
3、这些表;删除表存储受 DELTE 和 UPDATE 语句影响的行的副本当执行DELETE 或 UPDATE 语句时,行从触发器表中删除并传递到删除表中。删除表和触发器表通常没有共有的行。插入表存储受 INSERT 和 UPDATE 语句影响的行的副本当执行一NSERT 或 UPDAT 语句时,新行同时增加到插入表和触发器表中。插入表中的行是触发器表中新行的副本可使用删除表和插入表中的行来参照相关表中的行,或测试被删除或插入行中的值。6、数据库系统由哪几部分构成 答:数据库系统是指在计算机系统中引入数据库后的系统,一般由数据库,数据库管理系统( 及其开发工具),应用系统,数据库管理员构成。7、什
4、么是候选码 什么是主码 主码只能有一个属性吗 答:能唯一标识实体的属性或属性组称为超码,其任意真子集都不能成为超码的最小超码称为候选码;从所有候选码中选定一个用来区别同一实体集中的不同实体,称作主码;主码只能有一个属性。8、在 E-R 模型中联系是用来反映什么样的信息,它有几种类型 答:用来反映为实体(型)内部的联系和实体(型) 之间的联系,实体内部的联系通常是指组成实体的各属性之间的联系;实体之间的联系通常是指不同实体集之间的联系。联系可分为三种:一对一联系(1:1)一对多联系(1:n)多对多联系(m:n) 。9、什么是锁协议 什么是两段锁协议 答:数据库管理系统的并发控制在运用封锁方法时,
5、对数据对象加锁时需要约定一些规则,例如何时申请封锁,持锁时间,何时释放封锁等;这些规则就是锁协议。所谓两段锁协议是指所有事务必须两个阶段对数据项加锁和解锁。在对任何数据进行读,写操作之前,首先分申请并获得对该数据项加锁和解锁;在释放一个封锁之后,事务不现申请和获得任何其他封锁。10、数据库恢复的依据是什么 答:基本原理就是利用存储在后备副本,日志文件和数据库镜像中的冗余数据来重建数据库。11、关系数据库中的实体完整性和参照完整性对数据分别有什么样的约束 答:实体完整性规则是:若属性 A 是基本关系 R 的主属性,则属性 A 不能取空值。参照完整性规则是:若属性(或属性组)F 是基本关系 R 的
6、外码,它与基本关系 S 的主码 Ks 相对应(基本关系 R 和 S 不一定是不同的关系),则对于 R 中每个元组在 F 上的值必须为:或者取空值(F 的每个属性值均为空值);或者等于 S 中某个元组的主码值。12、数据库管理系统为什么要对事务进行并发控制 如果不进行并发控制会出现哪些问题 答:为了充分利用系统资源发挥数据库共享资源的特点,应该允许多个事务并行地执行,当多用户并发地存取数据库时就会产生多个事务同时存取同一数据的情况,若对并发操作不加控制就可能会存取和存储不正确的数据,破坏事务的一致性和数据库的一致性;所以数据库管理系统必须提供并发控制机制。如果不进行并发控制会出现数据丢失修改,不
7、可重复读和读“ 脏“ 数据等问题。13、在进行总体 E-R 图的优化时具体做什么 答:消除多余的属性和多余的联系。14、什么是外码 建立外码的作用是什么 答:外码指关系 R 中的一个属性组,它不是 R 的码,但它与另一个关系 S 的码相对应,则称这个属性组为 R 的外码。 如 S 关系中的 D#。建立外码的作用:在相应的表之间建立一种关联。15、数据库的结构数据模型有哪几种 按此划分 SQL SERVER 属于哪种类型 答:有层次模型,网状模型,关系模型,面向对象模型,对象关系模型等几种;SQL SERVER 属于关系模型。16、数据库管理系统为什么要对事务进行并发调度 并发调度时为什么要进行
8、并发控制 答:数据库是一个共享资源,可以供多个用户使用;如果事务一个一个地串行执行,则许多系统资源将处于空闲状态,因此为了充分利用系统资源发挥数据库共享资源的特点,应该允许多个事务并行地执行,进行并发调度;当多用户并发地存取数据库时就会产生多个事务同时存取同一数据的情况,若对并发操作不加控制就可能会存取和存储不正确的数据,破坏事务的一致性和数据库的一致性;所以数据库管理系统必须提供并发控制机制。17、写出数据库设计的步骤。答:(1)需求分析;(2)概念结构设计;(3)逻辑结构设计;(4)物理结构设计;(5)数据库实施;(6)数据库运行和维护。18、在建立 E-R 模型时如何区分实体和属性 答:
9、在给定的应用环境中,可以遵循以下准则来划分实体和属性:(1)属性与它所描述的实体之间只能是单值联系,即联系只能是一对多的;(2)属性不能再有需要进一步描述的性质;作为属性的数据项,除了它所描述的实体之外,不能再与其它实体具有联系。19、什么是触发器 答:是一种特殊类型的存储程序,在试图修改触发器所保护的表中的数据时,它就会自动执行。触发器可以包括大多数 Transact_sql 语句。触发器的查询计划存储在过程缓冲中。20、事务对象的属性 SQLCODE 的返回值有哪些,分别表示什么 答:SQLCode 指示最近一次 SQL 语句是操作成功还是失败,其可能取值为:0 操作成功-1 操作失败10
10、0 操作成功,但无返回数据21、什么是 ODBC 将它和专用接口进行比较。答: ODBC(Open Data Base Connectivity)接口是微软公司提出的开放式数据库互连标准接口,它以关系数据库标准查询语言 SQL 来存取连接到的数据源,ODBC 支持单个应用系统访问多个不同的数据库管理系统(DBMS),并且,对应用系统的开发人员来说,它能够用统一的方法处理不同的数据源,减轻了学习新系统的压力。现在,除了Oracle, Sybase,MS SQL Server, IBM DB/3 等大型数据库管理系统支持 ODBC 接口外,诸如 dBase, FoxPro, Sybase SQLA
11、nywhere,Excel 之类的数据源也都支持 ODBC 接口。专用接口针对具体的数据库管理系统而设计,对诸如 Oracle,Sybase, informix 之类的大型数据库管理系统,PowerBuilder 8。0 企业版都提供了专用接口,通过专用接口我们可以将 PowerBuilder 8。0 连接到相应的数据库上因为专用接口在设计上针对特定数据库的特点,能够充分发挥特定数据库的优势因此使用专用接口可以大大提高应用程序访问数据库的速度,所以应该尽可能使用专用接口而不是 ODBC 接口。数据库不同,数据库的版本不同,使用的专用接口也不同。22、什么是存储过程,可以在 POWER BUIL
12、DER 程序中调用存储过程吗 举例说明。答:存储过程是存储在服务器上的一个 SQL 语句的命令集合,存储过程是重复执行封装语句的一种有效方法。存储过程支持用户声明的变量,条件执行以及其他一些强大的编程功能。可以在 POWER BUILDER 程序中调用存储过程;例如:创建 datawindow 的时候 data source 选 Stored Procedure 会出现一个 title 为“Select Stored Procedure:。 。 。 。“ 的窗口, 选择所需要的 SP, 按 OK 按钮。 以后的操作和其他 dw 的建立一样。 也可以指定 SP 的返回结果集的各 column 的
13、名称。23、什么是视图 它有何作用 答:视图是命名的,从基本表中导出的虚表。它在物理上并不存在。存在的只是它的定义;视图中的数据是从基本表中导出的。每次对视图查询都要重新计算;视图之上可以再定义视图。视图的作用是让一定权限的操作者不用操作基本表就能满足其相应的操作要求,从而实现了对数据的安全管理。24、如何在 POWER BUILDER 程序中实现 copy 文件的功能 答:FUNCTION boolean CopyFile(ref string cfrom, ref string cto, boolean flag) LIBRARY “Kernel。dll“25、如何在 POWER BUIL
14、DER 程序中实现将数据窗口对象中的数据导出为 EXCEL 文件 答:dwcontrol。SaveAs ( filename, saveastype, colheading )二,交互式 SQL1、有一个教学管理数据库,包含以下基本表:(表略)用交互式 SQL 完成:建立学生表,主码为学号,性别为男 或女 。Create table 学生(学号# char(8) not null,姓名 char(8) not null,性别 char(2),年龄 smallint,年级 char(8),系编号 integer,primary key (学号#),check (性别 =男或女),)建立教师表,主
15、码为教师编号,外码为系编号。Create table 教师(教师编号# char(8) not null,姓名 char(8) not null,年龄 smallint,职称 char(4),系编号 integer,primary key (教师编号#),foreign key (系编号) references 院系 (系编号#),)建立选课表,主码为学号和课程编号,外码为学号,课程编号。Create table 选课(学号# char(8),课程编号# char(4),成绩 smallint,primary key (学号#, 课程编号#),foreign key (学号#) referen
16、ces 学生(学号#),foreign key (课程编号#) references 课程(课程编号#),check (成绩 is null ) or (成绩 between 0 and 100 ),)将学生张三从编号为 001 的系转到编号为 002 的系。Updata 学生Set 系编号# = 002Where 姓名=“ 张三“and 系编号#=001统计学生总人数。Select count (学号#)From 学生显示计算机系的学生的信息。Select *From 教师,任课,课程Wher 课程名=“ 数据库原理“ and 课程。课程编号# = 任课。课程编号# and 任课。教师编号#
17、 = 教师。教师编号#查找法律系的系办电话。Select 系办电话From 院系Where 系名= “法律系“删除 2000 级的学生记录。Delete from 学生Where 年级= “2000 级“将计算机系教师张明的职称升为教授。Updata 教师Set 职称= “教授“Where 姓名= “张明“ and 教师编号 # = ( select 教师编号#From 院系Where 系名= “计算机系“)统计计算机系教师张明的任课门数。Select count (课程编号#)From 院系,教师,任课Where 院系。系名= “计算机系“ and 院系。系编号# = 教师。系编号# and
18、 教师。教师编号# = 任课。教师编号#统计每个系的教师的人数。Select 系编号#, count (教师编号#)From 教师Group by 系编号#查找教授数据库原理的教师的姓名。Select 教师。姓名From 教师,任课,课程Where 课程名= “数据库原理“ and 课程。课程编号# = 任课。课程编号# and 任课。教师编号# = 教师。教师编号#删除 1020 号教师的任课记录。Delete from 任课Where 教师编号# = “1020“将课程数据库原理的学分设为 4。Updata 课程Set 学分 = 4Where 课程名= 数据库原理学生王明每选一个学分交费
19、100 元,统计它的选课总费用。Select sum (学分)* 100From 学生,课程,选课Where 学生。学号# = 选课。学号# and 选课。课程编号 = 课程。课程编号#统计 20 岁的学生总人数。Select count (age)From 学生Where 学生。年龄 = 20选修数据库原理的学生名单secect 学生。姓名from 学生,课程,选课where 课程。课程名 = “ 数据库原理“ and 课程。课程编号 # = 选课。课程编号# and 选课。学号# = 学生。学号#删除 20030 号学生的选课记录delete from 选课where 学号# = “200
20、030“建立一个存储过程,通过输入学号,显示学生的姓名,选课课程名,成绩,并统计出选课门数。Create procedure report id char(8) asSelect 学生。姓名,课程。课程名,选课。成绩,count ( 课程。课程编号#)From 学生,课程,选课Where 学生。学号# = id and 选课。学号# = 学生。学号# and 选课。课程编号# = 课程。课程编号#建立一个存储过程,通过输入教师编号,显示教师的姓名,任课课程名,教师院系。Create procedure report id char(8) as Select 教师。姓名,课程。课程名,院系。系名
21、From 院系,课程,教师,任课Where 教师。教师编号# = id and 任课。教师编号# = 教师。教师编号# and 课程。课程编号# = 任课。课程编号 and 教师。系编号 = 院系。系编号建立一个存储过程,输入系编号显示学生的学号,姓名。Create procedure report id char (8) asSelect 学号#,姓名From 学生Where 系编号# = id 2、有一数据库,包含以下基本表:(表略)建立销售明细表,销售编号为主码,外码为商品编号,会员号。Create table 销售明细(销售编号# char(4),商品编号# char(4),会员号#
22、char(4),数量 integer,时间 time,primary key (销售编号#),foreign key (商品编号#) references 商品(商品编号#),foreign key (会员号#) references 会员(会员号#),)添加一条商品记录(00697、雕牌肥皂,浙江, 2。00、日化)insert into 商品 values(00697、“ 雕牌肥皂“,“浙江“ ,2。00、“日化“)产生 00695 号产品的销售细帐。Select *From 销售明细Where 商品编号# = 00695根据商品编号 00695 查找该商品的销售总量。Select sum
23、 (数量)From 销售明细Where 商品编号# = 00695根据会员号 104095 删除其会员记录。Delete from 会员Where 会员号# = 104095(6)建立一个黄金会员视图。( 消费总金额高于 5000 的会员为黄金会员)create view 黄金会员as (select *from 会员where 消费总金额 5000 )(7)建立一个触发器,实现当输入一条销售记录时,将消费金额自动累加到会员的消费总金额。Create trigger trinameOn 销售明细For insert as Updata 会员Set 消费总金额 = 消费总金额 + sum (销售
24、明细。数量* 商品。单价)Where 销售明细。会员号# = 会员。会员号# and 商品。商品编号# = 销售明细。商品编号#POWER BUILDER 编程1、(1)对 w_data 的 open 事件编程,使 w_data 一打开 dw_1 中就显示数据。Dw_1。 settransobjict (splca)Dw_1。 retrieve( ) (2)添加int II= dw_1。 insertrow (0)Dw_1。 scrolltorow (i)Dw_1。 setfocus ( )删除dw_1 。 deleterow (0)保存int jj= dw_1 。 updata ( )if
25、I= -1 then messagebox (“information“ , “数据无法保存“)end if关闭close (parent )(3)对 w_data 的 closequery 事件编程,使 dw_1 中的数据发生改变而又未保存就退出窗口时给用户一个消息框提示。Integer mIf dw_1。modifiedcount ( ) + deletedcount ( )0 thenM = messagebox (“信息“数据已改变,是否保存“,question!YesNoCance!)If m=1 thenIf dw_1。updata ( )= -1 thenMessagebox (
26、“information“,“ 无法保存数据“)ElseMessagebox (“information“,“ 已保存数据“)End if Return 0Elseif m=2 thenReturn 0Elseif m=3 thenReturn 12、ddlb_1 中为各系名称,当选择了一个系后 tv_1 显示该系学生姓名,对 ddlb_1 的selectionchanged 事件编程。Int I String outnameDeclare namecur cursor forSelect distinct departmentFrom 学生Where department = :ddlb_1
27、。textOpen namecur ;If sqlca。sqlcode = -1 thenMessagebox ( “sql error “, sqlca ,sqlerrtext )Else Fetch namecur into :outname ;Do where sqlca 。sqlcode = 0Frtch namecur into :outname ;I=tv_1 。insertitemlast ( ) ,outname,2)L00p while sqlca 。sqlcode = 0Tv_1 :deleteitem (i)End if Close namecur ;3、 ddlb_1
28、为下拉列表框,st_1、st_2 为静态文本框。该窗口打开时,ddlb_1 从数据库中的院系表中读出了所有系名,当选择了某系时 st_1、st_2 分别显示该系系领导和系办电话。在 w_1 的 open 事件下编程。String outnameDeclare namecur cursor forSelect distinct departmentFrom 院系Where department = :ddlb_1。textOpen namecur ;If sqlca。sqlcode = -1 thenMessagebox ( “sql error “, sqlca ,sqlerrtext )El
29、se Fetch namecur into :outname ;Do where sqlca 。sqlcode = 0Ddlb_1。additem (outname)Fetch namecur into :outname ;L00p End if Close namecur ;在 ddlb_1 的 selectionchanged 事件下编程。Select 系领导,系办电话From 院系Where 系名= :ddlb_1 。text:st_1。text = 系领导:st_2。text = 系办电话4、w_query 上有控件 ddlb_1 和 dw_1、在 ddlb_1 中选择系名后 dw_1
30、 中显示该系的学生。如果通过带参数的数据窗口对象来完成,请问 dw_1 中的数据窗口对象的数据源为 quick select 还是 sql select。答:sql select。为 ddlb_1 的 selectionchanged 事件编程。Dw_1。settransobject (sqlca)Dw_1。retricve (ddlb_1。text)5、当选择了某单选框并输入选择条件,按回车后,dw_1 中显示满足条件的记录。请对以下控件编程。rb_1sle_1。enabled= true(2) sle_1dw-1。setfilter (“ 姓名= “+ sle_1。text +“ “)dw
31、_1。filter ( )cb_1。visible = true(3)cb_1rb_1。checked = falserb_2。checked = falserb_3。checked = falserb_4。checked = falsesle_1。text = “sle_2。text = “sle_3。text = “sle_4。text = “sle_1。enable = falsesle_2。enable = falsesle_3。enable = falsesle_4。enable = false6、lv_1 为列表视图,报表风格,当 w_list 打开时 lv_list 中显示数据库
32、中学生表的所有学生的信息。请为 w_1 的 open 事件编程。Integer I, j , outageString outname , outsex , soutageLv_1。addcolumn (“ 姓名“,left! , 800)Lv_1。addcolumn (“ 性别“,left! , 500)Lv_1。addcolumn (“ 年龄“,left! , 200)Declare namecur cursor forSelect 姓名,性别,年龄From 学生;Open namecur ;If sqlca。sqlcode = 1 thenMessagebox (“sql。error“
33、, sqlca。sqlerrtext )ElseI=1Do Fetch namecur into :outname, :outsex, :outage ;J=ILv_1。setitem(I , 2、 outname )Lv_1。setitem(I , 2、 outsex )Soutage = string (outage)Lv_1。setitem (I, 3、 soutage)I+Loop while sqlca。sqlcode=0Lv_1。deleteitem ( j)End ifClose namecur ;7、写出菜单项“注册新用户 “的 clicked 事件的代码。Open (w_ne
34、w)写出菜单“退出 “的 clicked 事件中的代码。Close (parentwindow)在 sle_1 中输入新用户名,如果此用户名已存在则出现消息框,提示“此用户名已存在,请另输入用户名“。Select usernameFrom userIf username = sle_1。text then msgbox(“提示“,“ 此用户名已存在,请另输入用户名 “)写出 cb_1 的 clicked 事件中的代码。Insert into userValues (:sle_1。text , :sle_2。text , :ddlb_1。text );8、窗口完成统计功能。按学号分组显示学生平均
35、成绩,并显示总评成绩。如果计算域平均成绩名为 compute_1、写出语句使平均成绩不及格者的平均成绩红色显示。Dw_1。object。compute_1。color = “0t if (compute_160、 255、 0)“在数据窗口对象的画板上计算域总评成绩和页码分别放在哪个区域。答:分别放在 summart 区域和 footer 区域。9、窗口打开时,树开视图显示数据库中所有学生的姓名,当你选择一个姓名时,在右侧的单行文本编辑框中显示学生的详细信息。为该窗口的 open 事件编程tv_1。insertitemfirst (0、 “学生“, 1)tv_1。insertitemfirst (1、 “张明“, 2)tv_1。insertitemfirst (1、 “王红“, 2)tv_1。insertitemfirst (1、 “周萧萧“, 2)为 tv_1 的 selectionchanged 事件编程int I treeviewitem l_lvI=tv_1。finditem(currentTreeItem ! , 0)Tv_1。getitem (I, l_lv)Select 姓名,性别,年龄Into :sle_1。text, :sle_2 。text , :sle_3。textFrom 学生Where 姓名= :l_lv。lable1;