答案:COMMIT、ROLLBACK
三、简答题
1.数据检索时,COMPUTE和COMPUTE BY产生的结果有何不同?
答案:使用COMPUTE子句和COMPUTE BY子句都是既能浏览明细数据又能看到统计的结果。只使用COMPUTE子句时,其查询的结果类似于总计,而使用COMPUTE BY子句时,其查询的结果将为带具体内容的分类进行统计。 2.对事务的管理包括哪几个方面? 答案:包括3个方面:
(1)事务控制语句。控制事务执行的语句。包括将一系列操作定义为一个工作单元。 (2)锁机制。封锁正被一个事务修改的数据,防止其他用户访问到不一致的数据。 (3)事务日志。使事务具有可恢复性。
3.简述事务保存点的概念。
答案:保存点提供了一种机制,用于回滚部分事务。可以使用SAVE TRANSACTION savepoint_name语句创建一个保存点,然后再执行ROLLBACK TRANSACTION savepoint_name语句回滚到该保存点,从而无须回滚到事务的开始。
在不可能发生错误的情况下,保存点很有用。在很少出现错误的情况下使用保存点回滚部分事务,比让每个事务在更新之前测试更新的有效性更为有效。更新和回滚操作代价很大,因此只有在遇到错误的可能性很小,而且预先检查更新的有效性的代价相对很高的情况下,使用保存点才会非常有效。
4.在应用程序中如何控制事务?
答案:应用程序主要通过指定事务启动和结束的时间来控制事务。主要使用Transact-SQL语句。系统还必须能够正确处理那些在事务完成之前便终止事务的错误。事务在连接层进行管理。当事务在一个连接上启动时,在该连接上执行的所有Transact-SQL语句在该事务结束之前都是该事务的一部分。
5.什么是锁定?
答案:在SQL Server 2000中,锁定就是给数据库对象加锁。使用锁定可以确保事务完整性和数据库一致性。锁定可以防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据。如果不使用锁定,则数据库中的数据可能在逻辑上不正确,并且对数据的查询可能产生意想不到的结果。
四、程序设计题
1.设有如下基本表R:
R(NO,NAME,SEX,AGE,CLASS) 主关键字是NO
其中NO为学号,NAME为姓名,SEX为性别,AGE为年龄,CLASS为班号。写出实现下列功能的Transact-SQL语句。 (1) 插入一个记录(25,’李明’,’男’,21,’95031’) (2) 插入’95031’班学号为30、姓名为’郑和’的学生记录 (3) 将学号为10的学生姓名改为’王华’ (4) 将所有’95101’班号改为’95091’ (5) 删除学号为20的学生记录 (6) 删除姓’王’的学生记录
答案:
(1) INSERT INTO R VALUES(25,’李明’,’男’,21,’95031’)
(2) INSERT INTO R(NO,NAME,CLASS) VALUES (30,’郑和’,’95031’) (3) UPDATE R
SET NAME=’王华’ WHERE NO=10 (4) UPDATE R
SET CLASS=’95091’
WHERE CLASS=’95101’ (5) DELETE FROM R
WHERE NO=20 (6) DELETE FROM R
WHERE NAME LIKE ’王%’
2.在前面建立的factory数据库上,用Transact-SQL语句完成如下各题:
(1) 显示各职工的工资记录和相应的工资小计。
(2) 按性别和部门名的所有组合方式列出相应的平均工资。
(3) 对worker和depart表进行完整外部联接显示职工的职工号、姓名和部门名。 (4) 显示最高工资的职工的职工号、姓名、部门名、工资发放日期和工资。 (5) 显示最高工资的职工所在的部门名。
(6) 显示所有平均工资低于全部职工平均工资的职工的职工号和姓名。 (7) 采用游标方式实现(6)的功能。
(8) 先显示worker表中的职工人数,开始一个事务,插入一个职工记录,再显示worker表中的职工人数,回滚该事务,最后显示worker表中的职工人数。 答案:
(1)SELECT worker.职工号,worker.姓名,salary.工资 FROM worker,salary
WHERE worker.职工号=salary.职工号 ORDER BY worker.职工号,worker.姓名 COMPUTE SUM(salary.工资) BY worker.职工号
(2)SELECT worker.性别,depart.部门名,AVG(salary.工资) AS ‘平均工资’ FROM worker,depart,salary
WHERE worker.职工号=salary.职工号 AND worker.部门号=depart.部门号 GROUP BY worker.性别,depart.部门名 WITH CUBE COMPUTE SUM(salary.工资) BY worker.职工号 (3)SELECT worker.职工号,worker.姓名,depart.部门名
FROM worker FULL JOIN depart ON (worker.部门号=depart.部门号) ORDER BY worker.职工号
(4)SELECT worker.职工号,worker.姓名,depart.部门名,salary.日期,salary.工资 FROM worker,depart,salary
WHERE worker.职工号=salary.职工号 AND worker.部门号=depart.部门号 AND salary=
(SELECT MAX(工资) FROM salary) (5)SELECT 部门名 FROM depart WHERE 部门号= (SELECT 部门号 FROM worker WHERE 职工号= (SELECT 职工号 FROM salary WHERE 工资=
(SELECT MAX(工资) FROM salary)
) )
(6) SELECT 职工号,姓名 FROM worker WHERE 职工号 IN (SELECT 职工号 FROM salary GROUP BY 职工号
HAVING AVG(工资)<(SELECT AVG(工资) FROM salary) ) (7) USE factory GO
SET NOCOUNT ON
DECLARE @no int,@name char(10) DECLARE w_cursor CURSOR
FOR SELECT 职工号,姓名
FROM worker WHERE 职工号 IN (SELECT 职工号 FROM salary GROUP BY 职工号
HAVING AVG(工资)<(SELECT AVG(工资) FROM salary)) OPEN w_cursor
FETCH NEXT FROM w_cursor INTO @no,@name PRINT ’-----------------’ WHILE @@FETCH_STATUS=0 BEGIN
PRINT CAST(@no AS char(8))+@name FETCH NEXT FROM w_cursor INTO @no,@name END
CLOSE w_cuesor DEALLOCATE w_cursor (8) USE factory GO
DECLARE @num int
SELECT @num=COUNT(*) FROM worker
PRINT ‘原职工人数:’+CAST(@num AS CHAR(3)) GO
DECLARE @num int BEGIN TRANSACTION
INSERT INTO worker VALUES(20,'陈立','女','55/03/08',1,'75/10/10',4) PRINT ‘插入一个职工记录’
SELECT @num=COUNT(*) FROM worker
PRINT ‘职工任数:’+ CAST(@num AS CHAR(3)) ROLLBACK TRANSACTION GO
PRINT ‘回滚事务’ DECLARE @num int
SELECT @num=COUNT(*) FROM worker
PRINT ‘职工人数:’+CAST(@num AS CHAR(3))
第7章 索引
一、单项选择题 1. 建立索引的目的是
A. 减少存储空间 B. 提高存取速度 C. 减少输入输出 D. 减少冗余 答案:B
2. 下列不适合创建索引的情况是
A. 主键 B.外键 C. 主属性 D. 只有较少值的列 答案:D
3. 创建索引时默认的顺序是
A. ASC B. DESC C. ORDER D. GROUP 答案:A
4. 包含索引的所有长度固定列的最大大小为
A. 256字节 B. 300字节 C. 512字节 D. 900字节 答案:D
5. 包含同一索引的列的最大数目是
A. 8 B. 16 C. 24 D. 32 答案:B
二、填空题
1. 按照存储结构的不同,可以将索引分为 和 两类。 答案:聚集索引、非聚集索引
2. 如果要求索引中的字段值不能重复,应该建立 索引。 答案:惟一
3. 索引是针对一个 而建立的。 答案:表
4.组合索引是指 索引。
答案:将两个或者多个字段组合起来的
5.FILLFACTOR的物理含义是在指定SQL Server创建索引的过程中,各索引页的填满程度。对于那些频繁进行大量数据插入或者删除的表,在建立索引时应该为将来生成的索引数据预留较大的空间,应将FILLFACTOR设得 。 答案:较少
三、简答题
1.什么是索引?索引分为哪两种?各有什么特点?
答案:索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。根据索引的顺序与数据表的物理顺序是否相同,可以把索引分为两种类型: ? ?
2.创建索引有什么优点和缺点? 答案:创建索引的优点如下: (1)加速数据检索。 (2)加快表与表之间的连接。
(3)在使用ORDER BY 和GROUP BY等子句进行数据检索时,可以减少分组和排序的时间。 (4)有利于SQL Server对查询进行优化。 (5)强制实施行的惟一性。 创建索引的缺点如下:
(1)创建索引要花费时间和占用存储空间。
(2)建立索引加快了数据检索速度,却减慢了数据修改速度。
3.哪些列上适合创建索引?哪些列上不适合创建索引? 答案:一般来说,以下的列适合创建索引:
(1)主键。通常检索、存取表是通过主键进行的,因此,应该考虑在主键上建立索引。
(2)连接中频繁使用的列。用于连接的列若按顺序存放,则系统可以很快地执行连接。如外键,除用于实现参照完整性外,还经常用于进行表的连接。
(3)在某一范围内频繁搜索的列和按排序顺序频繁检索的列。 以下的列不适合创建索引:
(1)很少或从来不在查询中引用的列。
(2)只有两个或很少几个值的列(如:性别),以这样的列创建索引并不能得到建立索引的好处。 (3)以bit、text、image数据类型定义的列。 (4)数据行数很少的小表一般也没有必要创建索引。
四、程序设计题
1.在前面建立的factory数据库上,用Transact-SQL语句完成下列各题:
(1)在worker表中的“部门号”列上创建一个非聚集索引,若该索引已存在,则删除后重建。 (2)在salary表的“职工号”和“日期”列创建聚集索引,并且强制惟一性。 答案:
(1)SET NOCOUNT OFF USE factory
聚集索引。数据表的物理顺序和索引表的顺序相同,它根据表中的一列或多列值的组合排列记录。
非聚集索引。数据表的物理顺序和索引表的顺序不相同,索引表仅仅包含指向数据表的指针,这些指针本身是有序的,用于在表中快速定位数据。