数据库应用考试题目答案.docx
《数据库应用考试题目答案.docx》由会员分享,可在线阅读,更多相关《数据库应用考试题目答案.docx(27页珍藏版)》请在冰点文库上搜索。
数据库应用考试题目答案
集团标准化工作小组[Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]
数据库应用考试题目答案
1.在安装SQLServer2000时,“仅客户端工具”、“服务器和客户端工具”及“仅连接”等安装定义有什么差别
答:
仅客户端工具:
仅安装客户端关系数据库管理工具。
此选项包含管理SQLServer的客户端工具和客户端连接组件。
服务器和客户端工具:
执行安装服务器和客户端工具以创建具有管理能力的关系数据库服务器。
仅连接:
仅安装关系数据库客户端连接组件,包括连接SQLServer2000命名实例所需的MDAC(Microsoft数据访问组件)。
该选项只提供连接工具,不提供客户端工具或其它组件。
2.一个数据库中包含哪几种文件
答:
主数据库文件:
用来存储数据库的启动信息以及部分或者全部数据,是所有数据库文件的起点,包含指向其它数据库文件的指针。
一个数据库只能有一个主数据库文件。
辅助数据库文件:
用于存储主数据库文件中未存储的剩余数据和数据库对象,一个数据库可以没有辅助数据库文件,但也可以同时拥有多个辅助数据库文件
事务日志文件:
一个存储数据库的更新情况等事务日志信息,当数据库损坏时,管理员使用事务日志恢复数据库;每一个数据库至少必须拥有一个事务日志文件,而且允许拥有多个日志文件。
3.事务文件和数据文件分开存放有什么好处
答:
因为利用事务日志备份可以将数据库恢复到特定的即时点(如输入不想要的数据之前的那一点)或故障发生点。
在媒体恢复策略中应考虑利用事务日志备份。
4.什么是批处理使用批处理有何限制
答:
包含一个或多个T-SQL语句的组,从应用程序将一次性发送到SQLServer执行,SQLServer批处理语句作为整体编译成一个可执行单元。
限制:
如不能够在同一个批处理中更改表,然后引用新列。
如在一个批处理程序中,有两条语句。
第一条语句用来在一张表中插入一个字段,如在User表中插入员工的出生年月;第二条语句则用来引用这个列,如根据身份证号码来推算出这个员工的出身年月并把这个值赋值给这个第一条语句创建的出身年月字段。
5.数据检索时,COMPUTE和COMPUTEBY产生的结果有何不同
答:
当COMPUTE带BY子句时,符合SELECT条件的每个组都有两个结果集:
每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。
每个组的第二个结果集有一行,其中包含该组的COMPUTE子句中所指定的聚合函数的小计。
当COMPUTE不带BY子句时,SELECT语句有两个结果集:
每个组的第一个结果集是包含选择列表信息的所有明细行。
第二个结果集有一行,其中包含COMPUTE子句中所指定的聚合函数的合计。
6.什么是索引索引分为哪两种各有什么特点
答:
数据库中的索引与书籍中的目录类似。
在一本书中,利用目录可以快速查找所需信息,无须阅读整本书。
在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。
聚集索引和非聚集索引。
聚集索引的特点:
行的物理位置和行在索引中的位置是相同的,每个表只能有一个聚集索引,聚集索引的平均大小大约为表大小的5%左右。
非聚集索引特点:
若未指定索引类型,则默认为非聚集索引,叶节点页的次序和表的物理存储次序不同,每个表最多可以有249个非聚集索引,在非聚集索引创建之前创建聚集索引。
7.创建索引有什么优点和缺点
答:
优点:
索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。
使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。
缺点:
索引需要占用数据表以外的物理存储空间。
创建索引和维护索引要花费一定的时间。
当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
8.什么是视图使用视图的优点和缺点是什么
答:
视图是一个虚拟表,其内容由查询定义。
同真实的表一样,视图包含一系列带有名称的列和行数据。
但是,视图并不在数据库中以存储的数据值集形式存在。
行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
优点:
隐蔽数据库的复杂性;控制用户提取数据;简化数据库用户管理;简化查询
缺点:
性能:
SQLServer必须把视图的查询转化成对基本表的查询,如果这个视图是由,一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQLServer也,把它变成一个复杂的结合体,需要花费一定的时间。
修改限制:
当用户试图修改视图的某些行时,SQLServer必须把它转化为对基本,表的某些行的修改。
对于简单视图来说,这是很方便的,但是,对于比较复杂的,视图,可能是不可修改的。
9.修改视图中的数据会受到哪些限制
答:
必须对视图的操作权限有权限
对视图上的某些列不能修改,这些列是:
计算列,内置函数列和行集合函数列
删除基表并不删除视图,建议采用与表明显不同的名字命名规则
对由多表连接成的视图修改数据时,不能同时影响一个以上的基表,也不能删除视图中的数据
如果某些列因为规则或者约束的限制不能接受从视图插入的数据时,则插入数据可能会失败
对具有NOTNULL的列进行修改时可能会出错。
通过视图修改或者插入数据时,必须保证未显示的具有NOTNULL属性的列有值,可以是默认值,IDENTITY等,否则不能像视图中插入数据行。
10.什么是数据完整性如果数据库不实施数据完整性会产生什么结果
答:
指的是数据库中存储的数据的一致性和准确性;包括了实体完整性、域完整性、参照完整性、用户定义的完整性。
能够防止数据库中存在不符合语义规定的数据,并且可以防止因错误信息的输入输出造成无效操作或错误信息。
后果:
无法保证数据库数据的一致性和准确性;容易造成数据库中存在不符合规定的数据或者错误信息
11.数据完整性有哪几类如何实施
答:
数据完整性分为四类:
实体完整性、域完整性、参照完整性、用户定义的完整性。
数据库采用多种方法来保证数据完整性,包括外键、束约、规则和触发器。
系统很好地处理了这四者的关系,并针对不同的具体情况用不同的方法进行,相互交叉使用,相补缺点。
12.什么是主键约束什么是惟一约束两者有什么区别
答:
主键约束:
有一列或列的组合,其值能唯一的标识表中的每一行。
唯一约束:
不允许数据库表在指定列上具有相同的值,但允许有空值。
区别:
一个表可以定义多个唯一约束,只能定义一个主键约束;空值得列上可以定义唯一约束,不能定义主键约束。
13.什么是外键,怎样建立外键约束
答:
外键是用于建立和加强两个表数据之间的链接的一列或多列。
通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。
这个列就成为第二个表的外键。
14.什么是存储过程使用存储过程有什么好处
答:
定义:
存储过程指的是存储在服务器上的Transact-SQL语句的命名集合,是封装重复性任务的方法,支持用户声明变量、条件执行以及其他强有力的编程特性。
好处:
存储过程封装了商务逻辑,确保一致的数据访问和修改。
若规则或策略有变化,则只需要修改服务器上的存储过程,所有的客户端就可以直接使用
屏蔽数据库模式的详细资料。
用户不需要访问底层的数据库和数据库内的对象
提供了安全性机制。
用户可以被赋予执行存储过程的权限,而不必在存储过程引用的所有对象上都有权限
改善性能。
预编译的Transact-SQL语句,可以根据条件决定执行哪一部分
减少网络通信量。
客户端用一条语句调用存储过程,就可以完成可能需要大量语句才能完成的任务,这样减少了客户端和服务器之间的请求/回答包
15.什么是触发器触发器分有什么作用
答:
触发器是一类特殊的存储过程,不能被直接调用,也不传递或接受参数
作用:
维护不可能在表创建时刻通过声明性约束进行的复杂的完整性约束限制。
通过记录所进行的修改以及谁进行了修改来审计表中的信息。
当表被修改的时候,自动给其他需要执行操作的程序发信号。
程序设计题
假设在factory数据库中已创建了如下3个表,
(1)职工表worker,其结构为:
职工号:
int,姓名:
char(8),性别:
char
(2),出生日期:
datetime,党员否:
bit,参加工作:
datetime,部门号:
int。
(2)部门表depart,其结构为:
部门号:
int,部门名:
char(10)。
(3)职工工资表salary,其结构为:
职工号:
int,姓名:
char(8),日期:
datetime,工资:
decimal(6,1)。
1.使用Transact-SQL语句完成如下各题:
(1).显示所有职工的年龄。
(2).求出各部门的党员人数。
(3).显示所有职工的姓名和2004年1月份工资数。
(4).显示所有职工的职工号、姓名和平均工资。
(5).显示所有职工的职工号、姓名、部门名和2004年2月份工资,并按部门名顺序排列。
(6).显示各部门名和该部门的所有职工平均工资。
(7).显示所有平均工资高于1200的部门名和对应的平均工资。
(8).显示所有职工的职工号、姓名和部门类型,其中财务处和人事处属管理部门,市场部属市场部门。
答案:
(1).SELECT姓名,YEAR(GETDATE())-YEAR(出生日期)AS‘年龄’FROMworker
(2).SELECTdepart.部门名,count(*)AS‘党员人数’
FROMworker,depart
WHEREworker.党员否=1ANDworker.部门号=depart.部门号
GROUPBYdepart.部门名
(3).SELECTworker.姓名,salary.工资
FROMworker,salary
WHEREworker.职工号=salary.职工号ANDYEAR(salary.日期)=2004ANDMONTH(salary.日期)=1
(4).SELECT职工号,,AVG(工资)AS‘平均工资’
FROMsalary
GROUPBY职工号
(5).SELECTworker.职工号,worker.姓名,depart.部门名,salary.工资AS‘2004年2月工资’
FROMworker,depart,salary
WHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号ANDYEAR(salary.日期)=2004ANDMONTH(salary.日期)=2
ORDERBYworker.部门号
(6).SELECTdepart.部门名,AVG(salary.工资)AS‘平均工资’
FROMworker,depart,salary
WHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号
GROUPBYdepart.部门名
(7).SELECTdepart.部门名,AVG(salary.工资)AS‘平均工资’
FROMworker,depart,salary
WHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号
GROUPBYdepart.部门名
HAVINGAVG(salary.工资)>1200
(8).USEfactory
GO
SELECTworker.职工号,worker.姓名
CASEdepart.部门名
WHEN‘财务处’THEN‘管理部门’
WHEN‘人事处’THEN‘管理部门’
WHEN‘市场部’THEN‘市场部门’
ENDAS‘部门类型’
FROMworker,depart
WHEREworker.部门号=depart.部门号
GO
2.在前面建立的factory数据库上,用Transact-SQL语句完成下列各题:
(1)在worker表中的“部门号”列上创建一个非聚集索引,若该索引已存在,则删除后重建。
(2)在salary表的“职工号”和“日期”列创建聚集索引,并且强制惟一性。
答案:
(1)SETNOCOUNTOFF
USEfactory
IFEXISTS(SELECTnameFROMsysindexesWHEREname=’depno’
DROPINDEX
GO
CREATEINDEXdepnoONworker(部门号)
GO
(2)SETNOCOUNTOFF
USEfactory
IFEXISTS(SELECTnameFROMsysindexesWHEREname=’no_date’
DROPINDEX
GO
CREATEUNIQUECLUSTEREDINDEXno_dateONsalary(职工号,日期)
GO
3.在前面建立的factory数据库上,用Transact-SQL语句完成下列各题:
(1)建立视图View1,查询所有职工的职工号、姓名、部门名和2004年2月份工资,并按部门名顺序排列。
(2)建立视图View2,查询所有职工的职工号、姓名和平均工资。
(3)建立视图View3,查询各部门名和该部门所有职工平均工资。
(4)显示视图View3的定义
答案:
(1)USEfactory
GO
IFEXISTS(SELECTTABLE_NAMEFROM
WHERETABLE_NAME=’View1’)
DROPVIEWView1
GO
CREATEVIEWView1
ASSELECTTOP15worker.职工号,worker.姓名,depart.部门名,
salary.工资AS‘2004年2月工资’
FROMworker,depart,salary
WHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号
ANDYEAR(salary.日期)=2004ANDMONTH(salary.日期)=2
ORDERBYworker.部门号
GO
SELECT*FROMView1
GO
(2)USEfactory
GO
IFEXISTS(SELECTTABLE_NAMEFROM
WHERETABLE_NAME=’View2’)
DROPVIEWView2
GO
CREATEVIEWView2
ASSELECTworker.职工号,worker.姓名,AVG(salary.工资)AS‘平均工资’
FROMworker,salary
WHEREworker.职工号=salary.职工号
GROUPBYworker.职工号,worker.姓名
GO
SELECT*FROMView2
GO
(3)USEfactory
GO
IFEXISTS(SELECTTABLE_NAMEFROM
WHERETABLE_NAME=’View3’)
DROPVIEWView3
GO
CREATEVIEWView3
ASSELECTdepart.部门名,AVG(salary.工资)AS‘平均工资’
FROMworker,depart,salary
WHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号
GROUPBYdepart.部门名
GO
SELECT*FROMView3
GO
(4)USEfactory
GO
EXECsp_helptext‘View3’
GO
4.在前面建立的factory数据库上,用Transact-SQL语句完成下列各题:
(1)实施worker表的“性别”字段默认值为“男”的约束。
(2)实施salary表的“工资”字段值限定在0~9999的约束。
(3)实施depart表的“部门号”字段值惟一的非聚集索引的约束。
(4)为worker表建立外键“部门号”,参考表depart的“部门号”列。
(5)建立一个规则sex:
@性别='男'OR@性别='女',将其绑定到worker表的“性别”列上。
(6)删除
(1)小题所建立的约束。
(7)解除(5)小题所建立的绑定并删除规则sex。
答案:
(1)ALTERTABLEworker
ADDCONSTRAINTdefault_sexDEFAULT‘男’FOR性别
(2)ALTERTABLEsalary
ADDCONSTRAINTcheck_salaryCHECK(工资>0AND工资<9999)
(3)ALTERTABLEdepart
ADDCONSTRAINTunique_departUNIQUENONCLUSTERED(部门号)
(4)ALTERTABLEworker
ADDCONSTRAINTFK_worker_noFOREIGNKEY(部门号)REFERENCESdepart(部门号)
(5)CREATERULEsexAS@性别='男'OR@性别='女'
EXECsp_bindrule‘sex’,’worker.性别’
(6)ALTERTABLEworker
DROPCONSTRAINTdefault_sex
(7)EXECsp_unbindrule’worker.性别’
DROPRULEsex
5.在前面建立的factory数据库上,用Transact-SQL语句完成下列各题:
(1)创建一个为worker表添加职工记录的存储过程Addworker。
(2)创建一个存储过程Delworker删除worker表中指定职工号的记录。
(3)显示存储过程Delworker。
(4)删除存储过程Addworker和Delworker。
答案:
(1)USEfactory
GO
CREATEPROCEDUREAddworker
@noint=NULL,
@namechar(10)=NULL,
@sexchar
(2)=NULL,
@birthdaydatetime=NULL,
@nabit=NULL,
@wtimedatetime=NULL,
@depnoint=NULL
AS
IF@noISNULLOR@nameISNULLOR@sexISNULLOR@birthdayISNULLOR@depnoISNULL
BEGIN
PRINT‘请重新输入该职工信息!
’
PRINT‘你必须提供职工号、姓名、性别、出生日期、部门号’
RETURN
END
BEGINTRANSACTION
INSERTINTOworkerVALUES(@no,@name,@sex,@birthday,@na,@wtime,@depno)
IF@@error<>0
BEGIN
ROLLBACKTRAN
RETURN
END
COMMITTRANSACTION
PRINT‘职工’+@name+’的信息成功添加到表worker中’
执行下列语句,可验证存储过程的正确性:
USEfactory
GO
Addwoeker20,’陈立’,’女’,’55/03/08’,1,’75/10/10’,4
GO
SELECT*FROMworker
GO
(2)USEfactory
GO
CREATEPROCEDUREDelworker
@noint=NULL
AS
IF@noISNULL
BEGIN
PRINT‘必须输入职工号!
’
RETURN
END
BEGINTRANSACTION
DELETEFROMworkerWHERE职工号=@no
IF@@error<>0
BEGIN
ROLLBACKTRAN
RETURN
END
COMMITTRANSACTION
PRINT‘成功删除职工号为’+CAST(@noASCHAR
(2))+’的职工记录’
执行下列语句,可验证存储过程的正确性:
USEfactory
GO
Delwoeker20
GO
SELECT*FROMworker
GO
(3)USEfactory
GO
EXECsp_helptextDelworker
GO
(4)USEfactory
GO
IFEXISTS(SELECTnameFROMsysobjects
WHEREname=’Addworker’ANDtype=’P’
DROPPROCEDUREAddworker
GO
IFEXISTS(SELECTnameFROMsysobjects
WHEREname=’Delworker’ANDtype=’P’
DROPPROCEDUREDelworker
GO
6.在前面建立的factory数据库上,用Transact-SQL语句完成下列各题:
(1)在表depart上创建一个触发器depart_update,当更改部门号时同步更改worker表中对应的部门号。
(2)在表worker上创建一个触发器worker_delete,当删除职工记录时同步删除salary表中对应职工的工资记录。
(3)删除触发器depart_update。
答案:
(1)USEfactory
GO
IFEXISTS(SELECTnameFROMsysobjects
WHEREtype=’TR’ANDname=’depart_update’
DROPTRIGGERdepart_update
GO
CREATETRIGGERdepart_updateONdepart
FORUPDATE
AS
DECLARE@olddepnoint,@newdepnoint
SELECT@olddepno=部门号FROMdeleted
SELECT@newdepno=部门号FROMinserted
UPDATEworker
SET部门号=@newdepno
WHERE部门号=@olddepno
GO
(2)USEfactory
GO
IFEXISTS(SELECTnameFROMsysobjects
WHEREtype=’TR’ANDname=’worker_delete’
DROPTRIGGERworker_delete
GO
CREATETRIGGERworker_deleteONwork