《数据库技术(SQL Server 2000)》试题库 一、 判断题: (10*2分) 1 ( ) 安装SQL Server 2000 的最低硬件要求只能保证SQL Server 2000的运行, 并不能保证在实际运行环境中, 能够满足多用户频繁地, 高效地访问数据库服务器。 2 ( ) 安装SQL Server 2000时, 系统会自动建立四个系统数据库: master, model, tempdb, msdb和一个用户数据库示例pubs。 3 ( X ) 在SQL Server 2000 中, 所有数据库对象中的数据, 都是以表的形式存放, 包括索引和视图。 4 ( X ) 对于SQL Server 2000中的每个表来说, 最多能建立254个聚簇索引。 5 ( ) 如果表中的数据发生变化, 那从相应视图中查询出的数据也就随之改变。 6 ( X ) 在SQL Server 2000 中, 所有的视图都是可以更新的。 7 ( X) 一个基本表中可能有不止一个时间戳字段。 8 ( ) 表中的每一列只能与一个默认绑定。 9 ( X ) 如果在建表时设置某一列为primary key, 那该列中可以输入重复。 10(X ) 数据类型中, datetime 类型和smalldatetime类型没有任何区别。 11( ) SQL Server数据库是关系数据库,它将所有数据存放在二维表中。 12(X ) SQL Server数据库中,主键是为了实现实体的完整性,主键字段中可以出现重复值。 13(X ) SQL Server服务只有2种状态:启动和停止。 14( ) SQL Server使用文件映射数据库,所有数据和对象都存放在文件中。 15(X )一个SQL Server数据库只能有一个主数据文件和一个日志文件。 16(X ) SQL Server中一个文件可以被多个数据库共用。 17(X )一个表只能有一个聚集索引和一个非聚集索引。 18(X )可以对任何字段建立唯一索引。 19(X )索引只能是升序的。 20( ) SQL Server中只保存视图的定义。 21()表与表之间的关联性通过主键和外键实现。 22()每个表有且仅有一个主键、主键的值必须唯一、且不能为空。 23(X)不可能在同一台计算机上安装多个SQL Server实例。 24()在SQL Server中可导入其它类型的数据库。 25(X)要想将一个SQL Server数据库移植到另一台装有企业管理器的计算机上进行管理,只须直接将数据库文件拷贝过去即可。 26(X)数据库、表、视图、索引、存储过程、触发器等都是数据库对象。 27()数据库可以以2个或多个文件的形式存储在磁盘中。 28()页和扩展盘区(有时译为“范围”)是SQL Server 2000对数据库对象进行空间分配的数据结构。 29(X)若一个文件的扩展名是mdf,则可判断其为主文件,反之亦然。 30()使用UPDATE语句既可以一次修改一行数据也可以一次修改多行数据。 31()HAVING只能与GROUP一同使用,表示只返回满足条件的分组。 32()count(字段)和count(*)是有区别的。 33(X)在主键上只能建立聚簇索引。 34()向表中插入字符串时,如果实际长度大于字段的定义长度,则系统将报告错误信息,且不向表中插入该记录。 35(X) SQL Server支持用户定义的数据类型,它是一种新的数据类型。 36()位运算符的两个操作数不能同时是二进制字符串数据类型分类中的某种数据类型。 37(X)当一个表被删除时,该表的所有触发器不会同时被删除。 38()一个表可以有多个insert触发器,但只有最后创建的触发器才会发生作用。 39()一个触发器只能用于一个表。 40(X)因存储过程可通过return返回状态值,故可作为表达式使用。 41(X)与创建视图类似,创建触发器时,其AS后只可接一条SQL语句。 二. 根据要求用T-SQL语句编程(70分) (一) 建立一个数据库“学生信息”数据库,主数据文件逻辑名为student,保存在d:\s1.mdf中,初始大小为2MB,文件增长率为15%;次数据文件逻辑名为student2,保存在 d:\s2.ndf中,且属于文件组G1;日志文件逻辑名为studentlog,保存在d:\slog.ldf中。 现有如下4张表,属于“学生信息”数据库。请写出创建“学生表”的语句,要求学号为主键,姓名非空,其余信息根据实际情况决定。 学生表 学号 姓名 出生日期 年龄 地区号 系号 入学成绩  2003001 葛文卿 1981-6-10  C1 X1 455  2003002 郑秀莉 1982-10-1  C2 X2 390  2003003 刘成锴 1984-1-29  C3 X1 428  2003004 李涛 1982-2-28  C4 X1 440  2003005 沈香娜 1982-12-4  C3 X4 395  2003006 李涛 1983-1-2  C2 X3 395  2003001 肖一竹 1981-7-23  C3 X4 400   3、将学生表中的第一条记录插入到刚建的学生表中。 4、通过计算用update给每个学生填好年龄。 5、给学生表增加备注字段(类型为text)。 6、查询1983年1月1日前出生且入学成绩在400分以上的学生姓名、年龄。 7、查询所有姓“刘”的学生学号、姓名。 8、要求显示课程个数。 9、查询出生的学生人数在3个以上的出生年份。 10、查询每个学生的姓名、所在院系名、来源地区名。 11、创建视图,用于保存与李涛来源于同一地区的学生姓名。 12、查询与郑秀莉学同一门课的学生姓名、课程名。要求结果中不包括郑秀莉本人。 13、根据现有数据生成一个新表“部分地区学生”,要求包括海陵区所有学生的全部信息。 14、将高港区的所有学生添加进“部分地区学生”中。 15、创建一个新表:高等数学成绩名次表,用于保存“高等数学”课程的各个学生成绩及名次。要求字段为:姓名、学号、成绩、名次。 16、等待10秒钟后显示100以内能被7整除的数。 17、存储过程 (二)三个表的结构和数据分别如下, 存放于名叫 “客户管理” 的数据库中. 表1: 客户信息表 姓名 银行卡号 家庭住址 身份证号码  郑秀莉 1000200030001 青年路10 号 322222222222131314  沈香娜 1000200030002 古川路10 号 322222222222131587  李 涛 1000200030005 湖北路10 号 322222222222131869  表2: 客户消费表 银行卡号 消费时间 消费金额 购买物件  1000200030005 2003.03.10 10.00 茶杯  1000200030001 2003.5.10 1800.35 冰箱  1000200030005 2003.05.12 100.00 衣物  1000200030002 2003.05.18 2600.00 彩电  表3: 客户帐户信息表: 银行卡号 最新更改时间 剩余资金  1000200030001 2003.5.10 7938.00  1000200030002 2003.05.18 120.00  1000200030005 2003.05.12 36.56  1、写出创建名为“客户管理”的数据库的Transact-SQL 语句. 2、写出创建表1 的Transact-SQL 语句 3、写出创建表2 的Transact-SQL 语句 4、写出创建表3的Transact-SQL 语句 5、查询’李涛’的个人信息 6、查询所有客户的消费信息 7、查询’ 郑秀莉’ 的卡上还剩余多少钱 8、查询 ‘李涛’的消费记录 9、统计 ‘郑秀莉’ 花在购物上的总共金钱数. 10、统计 ‘李涛’在五月份总共花在购物上的金钱数. 11、到目前为止消费金额最多的人的姓名. (三) 建立一个数据库“学生管理”数据库,主数据文件逻辑名为student,保存在d:\s1.mdf中,初始大小为1MB;次数据文件逻辑名为student2,保存在 d:\s2.ndf中;日志文件逻辑名为studentlog,保存在d:\slog.ldf中。 现有如下4张表,属于“学生管理”数据库(以下各题均以此为基础)。请写出创建“班主任表”的语句,要求编号为主键,姓名非空。 学生表 学号 姓名 出生日期 年龄 班级号  2003001 葛文卿 1981-6-10  B1  2003002 郑秀莉 1982-10-1  B2  2003003 刘成锴 1984-1-29  B3  2003004 李涛 1982-2-28  B4  2003005 沈香娜 1982-12-4  B5  2003006 李涛 1983-1-2  B4  2003001 肖一竹 1981-7-23  B1   3、将班主任表中的第一条记录插入到刚建的表中。 4、通过计算用update给每个学生填好年龄。 5、给学生表增加图象字段(类型为image)。 6、查询1982年10月1日后出生的学生姓名、年龄。 7、查询所有姓“肖”的学生学号、姓名。 8、查询每个班级的学生人数。要求至少显示班级名称、人数。 9、查询每个学生的姓名和他的班主任姓名。 10、查询至少包含2个学生的系部名称。 11、创建视图“电子班学生”,用于保存01电子班所有学生信息。 12、使用select语句生成一个新表“国际贸易00”,表中包含该班所有学生全部信息。 13、查询与李涛在同一个班级的学生姓名。 14、查询与李涛在同一个系部的学生姓名。要求结果中不显示李涛本人。 15、等待10秒钟后显示100以内能被12整除的数。 16、删除学生表中姓名为“刘成锴”的记录。 17、按班级号统计各班的平均年龄。 三、问答题(10分,共2小题) 说出关系型表中主键的特点和作用。 特点:主键可以唯一地表示表中的不同记录,每个表有且仅有一个主键、主键的值必须唯一、且不能为空。主键的作用是为了实施实体的完整性。 说出自然连接和等值连接的特点。 等值连接:连接条件中使用=运算符。自然连接:在等值连接中去掉重复的字段 说出视图的特点和作用、with check option的作用。 视图本身并不保存数据,可节省空间,只有运行时才占用空间来暂时存放结果。它是保存在数据库中的SELECT查询,SELECT语句的结果集构成视图所返回的虚拟表。故又与查询不完全相同。 视图常用来将用户与基本表隔离开来以保护基本表,即将用户常用的数据以视图的形式提供给用户,用户只能访问视图。 WITH CHECK OPTION表示在对视图进行数据操作(insert、update)时必须满足子查询中的条件表达式。 说出主文件、次文件、日志文件的作用及个数要求。 主文件 包含数据库的起点信息(指向数据库的其余文件),并用于存储数据。每个数据库都有一个主要数据文件。默认扩展名为mdf。次文件 含有不能置于主要数据文件中的所有数据。有些数据库可能足够大,故需要多个次要数据文件,或使用位于不同磁盘驱动器上的次文件将数据扩展到多个磁盘。默认扩展名为ndf。日志文件 包含用于恢复数据库的日志信息。每个数据库都必须至少有一个日志文件。默认扩展名为ldf。 聚簇索引和非聚簇索引的区别。 聚簇索引:可以保证表中记录的物理存储次序与索引表中的顺序(即逻辑顺序)相同。在SQL数据库中,每个表只能有1个聚簇索引。随着表中数据的改变,聚簇索引会自动更新。 非聚簇索引:表中记录的物理存储次序与索引表中的顺序(即逻辑顺序)一般不相同。每个表可以有249个非聚簇索引。随着表中数据的改变,但非聚簇索引需人工更新。 说说数据类型char和varchar的异同。 对char,若实际长度不足,则以空格填充到尾部。varchar需要额外的存储开销,但能够删除字段尾部的空格。 7、将SQL语句组织成事务有何优点? 事务是并发控制的基本单位。事务是一个逻辑工作单元,它必须完整地执行,或者全都不执行,它是一个不可分割的工作单位。事务处理是保证数据库一致性状态的重要方法。 8、说出触发器的主要作用。 能够实现数据的完整性和数据的一致性 增强约束:它能实现比check约束更为复杂的约束。 跟踪、监督数据库:它能检测到数据库内的所有操作。 9、使用存储过程(而不使用T-SQL程序)的原因是什么? 模块化编程:可反复被调用。 快速执行:第一次执行时进行分析优化并驻留内存,以后直接执行。 减少网络通信量:只要一条调用语句就可执行存储在服务器上的存储过程。 安全机制:可只能执行而不让修改。 二. 根据要求用T-SQL语句编程题答案 (一) create database 学生信息 on(name=‘student‘,filename=‘d:\s1.mdf‘,size=2,filegrowth=15%) , filegroup g1 (name=’student2‘,filename=‘d:\s2.ndf‘) log on(name=’ studentlog ‘,filename='d:\slog.ldf') 2、create table学生表( 学号char(7) primary key, 姓名 char(8) not null,出生日期 datetime,年龄 tinyint,地区号 char(2),系号 char(2),入学成绩 int) 3、insert into 学生表(学号,姓名,出生日期,地区号,系号,入学成绩) values('2003001','葛文卿','1981-6-10','c1','x1',455) 4、update 学生表 set 年龄=2003-year(出生日期) 5、alter table学生表 add 备注 text 6、select 姓名, 年龄 from 学生表 where出生日期<’1983/1/1’ and 入学成绩>400 7、select 学号,姓名 from 学生表 where 姓名 like ‘刘%’ 8、select count(distinct 课程名) from 成绩表 9、select count(*) from 学生表 group by year(出生日期) having count(*)>3 10、select 姓名,系名,地区名 from 学生表,系部表,地区表 where 学生表.系号=系部表.系号 and 学生表.地区号=地区表.地区号 11、create view 视图题 as select 姓名 from 学生表 where 地区号 in (select地区号 from 学生表 where 姓名=’李涛’) 12、select 姓名,课程名 from 学生表,成绩表 where 学生表.学号=成绩表.学号 and 课程名= (select 课程名 from 学生表,成绩表 where 学生表.学号=成绩表.学号 and 姓名=’ 郑秀莉’) and 姓名!=’ 郑秀莉’ 13、select 姓名,学号,成绩,identity(int,1,1) as 名次 INTO 高等数学成绩名次表 from 学生表,成绩表 where 学生表.学号=成绩表.学号 AND 课程名=‘高等数学‘ group by 成绩 DESC 14、declare @x set @x=1 waitfor delay ‘00:00:08’ while @x<=100 begin if @x%9==0 print @x set @x=@x+1 end 15、create proc 查找学生 @name char(8) as if @name is null print ‘姓名未输入’ else if exists(select * from 学生表 where 姓名=@name) print ‘已找到’ else print ‘未找到’ go 16、begin tran update 成绩表 set 成绩=成绩+5 where 学号=‘2003005’ if @rowcount<>0 begin print “更新成功” select * from 成绩表 commit tran end else rollback tran 17、create trigger 监视姓名和年龄 on 学生表 for update,insert as if update(姓名) or update(年龄) print ‘姓名或年龄已改动!’ else print ‘没改动!’ (三) create database 学生管理 on(name=‘student‘,filename=‘d:\s1.mdf‘,size=1) ,(name=’student2‘,filename=‘d:\s2.ndf‘) log on(name=’ studentlog ‘,filename='d:\slog.ldf') 2、create table 班主任表( 编号 char(2) primary key, 姓名 char(8) not null) 3、insert into 班主任表 values('K1','高学仁') 4、update 学生表 set 年龄=2003-year(出生日期) 5、alter table学生表 add 图象 image 6、select 姓名, 年龄 from 学生表 where出生日期>’1982/10/1’ 7、select 学号,姓名 from 学生表 where 姓名 like ‘肖%’ 8、select 班级名称,count(*) as 人数 from 班级表,学生表 where 班级表.编号=学生表.班级号 group by 班级名称 9、select学生表.姓名 as 学生, 班主任.姓名 as 班主任 from 学生表, 班主任表,班级表 where 学生表.班级号=班级表.编号 and 班主任表.编号=班级表.班主任编号 10、select 系名 from 系部表,学生表,班级表 where 学生表.班级号=班级表.编号 and 班级表. 所属系部= 系部表.编号 group by 系名 having count(*)>2 11、create view 电子班学生 as select * from 班级表,学生表 where 班级表.编号=学生表.班级号 and 班级名称=‘01电子’ 12、select 学生表.*,班级名称 into 国际贸易00 from 班级表,学生表 where 班级表.编号=学生表.班级号 and 班级名称=‘00国际贸易’ 13、select 姓名from 学生表 where 班级号 in (select班级号from 学生表 where姓名=’李涛’) 14、select 姓名 from 学生表,班级表 where 班级表.编号=学生表.班级号 and 姓名<>’李涛’ and 所属系部 in (select 所属系部 from 学生表,班级表 where 班级表.编号=学生表.班级号 and 姓名=’李涛’) 15、declare @x set @x=1 waitfor delay ‘00:00:10’ while @x<=100 begin if @x%12==0 print @x set @x=@x+1 end 16、delete from 学生表 where 姓名=‘刘成锴’ 17、select 班级号,avg(年龄) as 平均年龄 from 学生表 group by 班级号