大型数据库期末试题以及答案
一、选择题
1、下面(_B___)描述是正确的。
A 、视图是一种常用的数据库对象,使用视图不可以简化数据操作。 B 、使用视图可以提高数据库的安全性。 C 、视图和表一样是由数据构成的。 D 、视图必须从多个数据表中产生才有意义。 2、下面(__D__)组命令,将变量count 值赋值为1。
A 、DIM @count int SELECT @count=1 B 、DIM count=1 int C 、DECLARE count int SELECT count=1 D 、DECLARE @count int SELECT @count=1
3、你要为一个向全世界出口产品的物流公司开发一个数据库。这个公司有关销售信息的资料都存储在一个名为sales 的表格内。消费者的名字都被存放一个名为Customers 的数据库内。以下是创建表格的脚本代码。 CREATE TABLE Customers ( CustomerID int NOT NULL,
CustomerName varchar (30) NOT NULL, ContactName varchar (30) NULL, Phone varchar (20) NULL, Country varchar (30) NOT NULL)
通常每个国家只有1,2名顾客。然而, 有些国家有多达20 名顾客。公司的营销部门想要对超过10个顾客的国家做广告。
你要为营销部门创建一个包含这些国家的名单列表。你应该使用哪个代码? ( A ) A. SELECT Country FROM Customers GROUP BY Country HAVING COUNT (Country) > 10
B. SELECT TOP 10 Country FROM Customers C. SELECT TOP 10 Country FROM Customers
FROM (SELECT DISTINCT Country FROM Customers) AS X GROUP BY Country HAVING COUNT(*) > 10 D. SET ROWCOUNT 10
SELECT Country , COUNT(*) as “NumCountries ”
FROM Customers GROUP BY Country ORDER BY NumCountries Desc 4、下列关于数据库、文件和文件组的描述中,错误的是( B )。 A )一个文件或文件组只能用于一个数据库 B )一个文件可以属于多个文件组 C )一个文件组可以包含多个文件 D )数据文件和日志文件放在同一个组中
5、学生成绩表包含列“学号”、“课程代号”、“成绩”、“考试时间”等。列“成绩”的值为NULL 表示该学生缺考这门课。请用SELECT 语句查询学号为“98120001”的学生所有缺考的课程数( A )。
A 、SELECT COUNT(*) FROM 学生成绩表
WHERE 学号 = '98120001' AND 成绩 IS NULL B 、SELECT COUNT(成绩) FROM 学生成绩表 WHERE 学号 = '98120001' AND 成绩 IS NULL C 、SELECT COUNT(*) FROM 学生成绩表 WHERE 学号 = '98120001' AND 成绩=NULL D 、SELECT COUNT(成绩) FROM 学生成绩表 WHERE 学号 = '98120001' AND 成绩= NULL
6、在录入公司业务信息时,要确保字段“业务量”的值在100到200之间,需要使用下列哪种约束( D )。
A )DEFAULT B )PRIMARY KEY C )UNIQUE D )CHECK 7、以下不是SQL Server 2005触发器类型的是(_B___)。 A 、INSERT 触发器 B 、SELECT 触发器 C 、UPDATE 触发器 D、DELETE 触发器
8、在学生成绩表tblCourseScore 中的列Score 用来存放某学生学习某课程的考试成绩(0~100分,没有小数), 用下面的哪种类型最节省空间?( C )。 A ) int B ) smallint C ) tinyint D ) decimal(3,0)
9、以下哪个不能用于处理缺失的信息.( A )
A. inner join B. left outer join C. right outer join D. full outer join 10、修改存储过程使用的语句是(_B___)。
A 、INSERT PROCEDURE B、ALTER PROCEDURE C 、DROP PROCEDUE D、DELETE PROCEDUE
11、在Insert Into 语句中某些列是可以不插入值,给出列时,可以省略这些列,以下说法
不正确的是:( D )
A. 具有Identity 属性的列,可以省略; B. 具有默认值的列,可以省略; C. 允许为空的列,可以省略; D. 设置为主键的列,可以省略
)
12、下列条目中, 哪个不属于ALTER TABLE的功能 ( D A .增加表的完整性约束 B.修改表中列的定义 C .增加表中的列 D.修改表中的记录 13、创建如下存储过程: CREATE PROCEDURE my_proc_def @first int = NULL, @second int = 2, @third int = 3 AS
SELECT @first, @second, @third GO
以下调用存储过程得到的结果错误的是 ( D ) 。 A 、EXECUTE my_proc_def 结果值:NULL 2 3
B 、EXECUTE my_proc_def 10, 20, 30 结果值:10 20 30 C 、EXECUTE my_proc_def @second = 500
结果值:NULL 500 3 结果值:40 500 50
D 、EXECUTE my_proc_def 40, @third = 50
14、在Transact-SQL 语法中,SELECT 语句的完整语法较复杂,但至少包括的部分(_D___)。 A 、SELECT ,INTO C 、SELECT ,GROUP
B 、SELECT ,FROM D 、仅SELECT
15、在Transact-SQL 语法中,使用关键字(_A ___)可以把重复行屏蔽。 A 、DISTINCT C 、ALL
B 、UNION D 、TOP
16、在Transact-SQL 语法中,将多个查询结果返回一个结果集合的运算符是(__B__)。 A 、JOIN C 、INTO
B 、UNION C 、LIKE
17、在Transact-SQL 语法中,可以对查询结果进行排序的子句是(_C___)。 A、GROUP BY C、ORDER BY
B 、COMPUTE BY D 、COMPUTE
18、在创建视图时,可以用来将包含创建此视图的文本加密的选项是(_B___)
A 、WITH SCHEMABINDING B 、WITH ENCRYPTION
C 、WITH CHECK OPTION D 、WITH VIEW_METADATA
19、一个数据库可以有几个主文件。(__C__) A 、可以0个
B 、至少一个
D 、可以0个,也可以多个
C 、有且仅有一个
20、在聚合函数中,即使每行都包含空值,仍会计算所有行的函数是(_C___)。 A 、SUM
B 、MAX D 、COUNT
C 、COUNT(*)
21、在数据库中创建表可以通过(_D___)等方法来实现。 A、企业管理器 C、OSQL
B 、查询分析器
D、企业管理器和CREATE TABLE语句
22、左外联接中TABLE1 LEFT OUTER JOIN TABLE2 ON JOIN_CONDITION如果现在TABLE2中没有相应的行,则返回( D )。
A 、没有返回 B、两个表所有行 C 、TABLE2中所有行 D、TABLE1中所有行 23、LIKE ’[A-C]%’匹配的内容是什么( B ) A .匹配以A 或C 开头的字符串
B .匹配以A 到C 当中任何一个字母开头的字符串
C .匹配以A 或C 开头的字符串,且字符串仅包含了两个字符
D .匹配以A 到C 当中任何一个字母开头的字符串,且字符串仅包含了两个字符 24、关于默认值和规则,下列描述不正确的是( C )
A. 列的默认值必须符合绑定到此列上的任何规则和CHECK 约束 B. 不能为已有默认绑定的列创建DEFAULT 约束
C. 创建的规则可检查出先前已经存在于数据库中的不符合规则的数据 D. 一个列或者用户定义数据类型只能被一个规则绑定 25、下面哪些语句属于数据定义语言(DDL )是( D )。 A .SELECT
B .INSERT
C .UPDATE
D .DROP
26、>ALL (1, 2, 3) 表示 3,>ANY (1, 2, 3) 表示 1( A )。
A 、大于,大于
B 、大于,小于
C 、小于,小于
D 、小于,大于
27、以下哪些不是SQL Server的系统数据库(D )。
A 、master
B 、model
C 、tempdb
D 、Northwind
28、已知,SQL Server中的触发器使用两种特殊的表:deleted 表和 inserted 表。那么下面的描述中那一个说法是错误的( D )。
A 、在执行 DELETE 语句时,行从触发器表中删除,并传输到 deleted 表中。 B 、在执行 INSERT 语句时,新建行被同时添加到 inserted 表和触发器表中。 C 、在执行 UPDATE 语句时,首先旧行被复制到 deleted 表中,然后新行被复制到触发
器表和 inserted 表中。
D 、虽然Microsoft SQL Server 2005 自动创建和管理deleted 表和 inserted 表,但是还是允许我们直接对表中的数据进行更改。
29、定单表Orders 的列OrderID 的类型是小整型(smallint ),根据业务的发展需要改为整型(integer ),应该使用下面的哪条语句(C )。
A 、ALTER COLUMN OrderID integer FROM Orders B 、ALTER TABLE Orders ( OrderID integer )
C 、ALTER TABLE Orders ALTER COLUMN OrderID integer D 、ALTER COLUMN Orders.OrderID integer
30、执行下面脚本,共有多少条记录插入到表tblTemp 中( D )。 CREATE TABLE tblTemp ( TempID integer not null, TempDate datetime not null) go
DECLARE @count integer SET @count = 1 WHILE @count
IF (SELECT COUNT(*) FROM tblTemp ) >= 10 BREAK ELSE Begin
INSERT tblTemp VALUES(@count,GETDATE()) SET @count = @count + 1 end END A 、0 二、判断题
1、insert into tableA select * from where address=’福建省福州市’,要正确运行如上语句,tableA 可以不存在,在查询的过程中生成。( F )
2、在 Transact-SQL 语句中,使用通配符“%”只能描述单个字符。( F )
3、在 Transact-SQL 语句的WHERE 子句中,可以用IN 搜索条件来代替由 OR 操作符连起
来的一系列比较操作符。( T )
4、对包含空值的字段使用聚合函数时,SQL Server 的聚合函数都将忽略字段中的空值( F )
5、在 Transact-SQL 语句中,使用通配符“[]”只能描述单个字符。( T )
B 、8
C 、9
D 、10
6、select A, B, C,count(*) from tableA group by A, B 以上语句不存在语法错误( F ) 7、以下定义变量及赋值语句是正确的( F )
declare @i int,@j int set @i=2,@j=2
8、在选择列表中,使用符号“ * ”代表选择表中所有的字段。( T )
9、触发器可以引用其他表中的列,能强制比 CHECK 约束更复杂的数据完整性。( T ) 10、触发器是通过事件触发而由系统自动执行的。( T )
11、列约束被指定为列定义的一部分,并且只应用到那一列。( T )
12、如果要在多列上创建相同的默认值,可以先定义默认值再采用绑定的方法。 ( T ) 13、一个数据库可以有多个主文件。( F ) 14、UNIQUE 约束指明任意两行不能有相同的值。( F ) 17、在游标中,要读取游标当前的值,用select 语句。(F ) 16、对一个表插入数据,一次只能插一条记录到表中。(F ) 17、禁用触发器后,若再想再次使用,必须重新创建。(F ) 三、填空题
1、系统存储过程是存储在 master 数据库内,以 SP_ 为前缀标识的。 2、可以定义一列或多列的值与同表或其他表中主键的值匹配的约束类型是 外键约束。 3、Transact-SQL 语句的种类分为 DML 、 DDL 和 DCL 三种。 4、某数据字段,其数据类型为decimail(7,4),若向某记录的该列赋值56.342619, 则该列实际存储的是 56.3426 。
5、 当标识符的第一个字符是符号时,代表它有特殊用处。以 @ 开头
的标识符代表局部变量或参数;以 @@ 开头的标识符代表全部变量或参数; 6、当在定义了触发器的表上执行 UPDATE 语句的时候,原行(前像)被移到 deleted 表中,而更新的行(后像)则插入 inserted 表中。 7、从表或视图中检索数据可以使用关键字 select ;将数据插入到表或视图中可使用关键字 insert ;更新表或视图中的数据可使用关键字 update ;从表或视图中删除数据可使用关键字 delete 。
8、在 Transact-SQL 语句中,用来创建对象的关键字是 create 、用来更改对象的关键字是 alter 、用来删除对象的关键字是 drop 。
9、在Transact-SQL 语句中,可以使用 CREATE DATABASE 语句来创建数据库,使用 CREATE TABLE 语句来创建表,使用 CREATE VIEW 语句来创建视图,使用 CREATE PROC 语句来创建存储过程.
10、使用 Alter table 通过更改、添加或删除列和约束,或者启用或禁用约束和触发器,从而修改表的定义.
11、编写LIKE 子句用来检索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的 所有名称:__ LIKE ‘[M-Z]inger’____
12、在流程控制语句中_______ begin„end_____________语句用于包括一组T-SQL 语句,使一组T-SQL 语句作为一个单元进行处理。
13、索引按照组织方式分,可以分为 聚集索引 和 非聚集索引 两种。 四、程序题
1、 请根据如下要求,使用Transact-SQL 进行填空
创建一个名为Students 的数据库, 其中:
主数据文件名为Students_Data1,初始大小10MB ,最大大小不受限制,次要数据文件名为Students_Data2,初始大小为5MB ,最大不超过50MB ;包含一个日志文件Students_Log,初始大小3MB ,最大不能超过5MB ,按5%增长;所有文件均存放在C:\SQLData文件夹下。
CREATE database Students on primary (
name ='Students_Data1',
filename ='C:\SQLData\Students_Data1.mdf', size =10mb ) , (
name ='Students_Data2',
filename ='C:\SQLData\Students_Data2.ndf', size =5mb , maxsize =50mb ) log on (
name ='Students_Log',
filename ='C:\SQLData\Students_Log.ldf', size =3mb , maxsize =5mb , filegrowth =5%
)
2、某银行数据库,有如下表CardInfo:
1) 创建默认值对象default_State,默认值取值为: ‘正常’
create default default_State as '正常'
2) 并将此默认值对象绑定到上表的State 字段中。 create table CardInfo ( )
exec sp_bindefault default_State,'CardInfo.State'
分值分布情况: 一、 填空题(2*10=20) 二、 选择题(2*15=30) 四、程序填空题(2*10=20) 五 、程序题(30) (四~五题)范围:
CardID char(19) not null, pass char(6) not null, balance money not null, State char(8) not null, openDate datetime not null
1、创建数据库
答:create database 数据库名
删除数据库 drop database dbname
2、默认对象的创建与绑定. use xsbook go
create default jss_default as 0 --创建默认值对象jss_default go
exec sp_bindefault 'jss_default','xs.借书数' --将默认值对象绑定到xs 表的列借书数 go
3、索引的添加
CREATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX 名字
ON {table_name | view_name} [WITH [index_property [,....n]]
说明:
UNIQUE: 建立唯一索引。 CLUSTERED: 建立聚集索引。 NONCLUSTERED: 建立非聚集索引。 Index_property: 索引属性。
UNIQUE 索引既可以采用聚集索引结构,也可以采用非聚集索引的结构,如果不指明采用的索引结构,则SQL Server系统默认为采用非聚集索引结构。 例如: CREATE UNIQUE INDEX Courseid ON Course(Cno);
4、视图的创建,往视图添加,修改数据
视图创建:
create view 视图名 as
select * from 表名
视图添加:INSERT INTO视图名VALUES('数据',' 数据') 修改数据:UPDATE 视图名 SET 字段名 = 修改的数据
5、触发器的创建,修改,删除(如更新触发器) 创建:
CREATE TRIGGER 触发器名称 ON 表名
FOR INSERT、UPDATE 或 DELETE AS
T-SQL 语句
注意:触发器名称是不加引号的。
删除:
在查询分析器中使用 drop trigger 触发器名称 来删除触发器。 也可以同时删除多个触发器:drop trigger 触发器名称, 触发器名称...
重命名:
exec sp_rename 原名称, 新名称
修改:
alter trigger trigger_name on {table_name view_name}
{for After Instead of } [ insert, update,delete ] as
sql_statement
例题:
--1、在SC 表上,建立后触发的插入触发器Check_Count1,规定每门课程的选课人数不能超过4人,若该课程选课人数未满4人,可以插入数据。(前提:一次插入一条记录)
create Trigger Check_Count1 On SC For Insert AS
Declare @cno Char (10), @StuCount int Select @cno=cno from Inserted
Select @StuCount=Count (*) From SC Group by cno Having cno=@cno If @StuCount>4 Begin
RollBack Transaction --回滚事务,即使没有使用Begin Transaction 语句;
Raiserror (' 该课程的选课人数超过,已经满额!' , 16, 1) --输出自定义的错误信息,Rollback 后的语句仍然被执行; End Go
--测试上面的触发器;
select Cno, count (sno ) from SC group by Cno go
insert into SC Values ('2006010103' , 'J004' ,null)
--delete from SC where Sno='2006010104' and Cno='J001' go
drop Trigger Check_Count1
--2、在SC 表上,建立替代触发的插入触发器Check_Count2,规定每门课程的选课人数不能超过4人,若该课程选课人数未满4人,可以插入数据。(前提:一次插入一条记录)
Create Trigger Check_Count2 On SC Instead of Insert AS
Declare @cno Char (10), @StuCount int Select @cno=cno from Inserted
Select @StuCount=Count (*) From SC Group by cno Having cno=@cno If @StuCount>=4
Raiserror (' 该课程的选课人数超过,已经满额!' , 16, 1)
Else
Insert SC Select * From Inserted
Go
--测试上面的触发器;
select Cno, count (sno ) from SC group by Cno
go
insert into SC Values ('2006010103' , 'J004' ,null)
insert into SC Values ('2006010103' , 'J002' ,NUll)
delete from SC where Sno='2006010103' and Cno='J004'
go
drop Trigger Check_Count2
--3、在SC 表上,建立一个Update 后触发器Check_CNO1,当学生修改课程编号时,给出提示信息,并不能修改该列。
Create Trigger Check_CNO1 On SC
After Update
AS
If Update (CNO )
Begin
Raiserror (' 课程号不能修改,请删除选课后,重新选课!' , 16, 1)
RollBack Transaction
End
Go
--测试上面的触发器;
select * from SC order by Cno
update SC set Cno='J001' where Sno='2006010105' and Cno='J004' go
drop Trigger Check_CNO1
6、存储过程的创建,执行,修改,删除(如:有输入参数,返回值的存储过程)
1、创建存储过程Price_order查询产品的名称,价格,并按照价格进行排序, 并执行。
create proc Price_order
as
select pName , price
form products
order by price asc/desc
go
2、创建存储过程Most_expensiveProduct查询最高价格的产品,并执行。 create proc Most_expensiveProduct
as
select top 1 with ties pName , price
form products
order by price desc
go
3、创建存储过程TotalPrice ,计算所有产品总价格,并执行。
create procedure TotalPrice
as
select sum(price) as 总价格 from products
go 创建:
1 CREATE PROCEDURE Get_Data
2 (
3 @Dealer_ID VARCHAR (50)
4 )
5 AS
6 SELECT * FROM myData WHERE Dealer_ID = @Dealer_ID
修改: 1 ALTER PROCEDURE [dbo]. [Get_Data]
2 (
3 @Dealer_ID VARCHAR (50)
4 )
5 AS
6 SELECT * FROM myData WHERE Dealer_ID = @Dealer_ID
删除:drop procedure sp_name
7、函数的创建,修改,删除(如:标量函数)
创建:
CREATE FUNCTION [dbo].[函数名](参数)
RETURNS NVARCHAR(15)
AS
BEGIN
修改:
alter function 名称
([{@参数名称 参数类型[=默认值]}[,n]])
returns @局部变量 table
[with encryption]
[as]
begin
函数体
return 函数返回值 end
删除:drop function 函数名
一、创建标量用户定义函数
1、在学生信息管理系统中,学生信息表包含列“学号”、列“姓名”;课程信息表包含列“课程代号”、“课程名称”;学生成绩表包含列“学号”、列“课程代号”、列“成绩”,已用约束保证成绩的范围为0~100分。
编写标量函数fn_StudentScore,要求:输入一个学号和一个课程号,返回这个学生这门课的成绩,如果此学生没有选这门课,返回-1。
CREATE FUNCTION fn_StudentScore
(@stu_id char(8) ,@course_id char(3))
returns int
as
begin
declare @a int
set @a=(select score from score
where stu_id=@stu_id and course_id=@course_id)
if @a is null
begin
set @a=-1
end
return @a
end
2、测试函数fn_StudentScore(选两个例子,一个显示成绩,一个显示-1)
declare @score int
exec @score = fn_StudentScore @stu_id='0601009' ,@course_id='009'
select @score as 成绩
declare @score int
exec @score = fn_StudentScore @stu_id='0601002' ,@course_id='009'
select @score as成绩
3、在学生信息管理系统中,学生信息表包含列“学号”、列“姓名”;课程信
息表包含列“课程代号”、“课程名称”;学生成绩表包含列“学号”、列“课程代号”、列“成绩”,已用约束保证成绩的范围为0~100分。
编写用户定义函数fn_EvaluateOneStudent,要求:每次输入一个学号,计算该学生的所有课程的平均分,如果是85~100分,返回“优”;如果是75~84分,返回“良”;如果是65~74分,返回“中”;如果是0~64分,返回“差”。
CREATE FUNCTION fn_EvaluateOneStudent
(@学号 char(8))
RETURNS varchar(10)
AS
BEGIN
DECLARE @平均分 integer, @等级 varchar(10)
SELECT @平均分=AVG(score)FROM score WHERE stu_id=@学号 IF @平均分 BETWEEN 85 AND 100
SET @等级='优'
ELSE
IF @平均分 BETWEEN 75 AND 84
SET @等级='良'
ELSE IF @平均分 BETWEEN 65 AND 74
SET @等级='中'
ELSE IF @平均分 BETWEEN 0 AND 64
SET @等级='差'
RETURN @等级
END
4、测试函数fn_EvaluateOneStudent
例如:判断学号为0601002、0601006、0601009的同学的等级。
declare @等级 varchar(10),@学号 char(8)
set @学号= '0601002'
exec @等级= fn_EvaluateOneStudent @学号=@学号
select @学号 as 学号,@等级 as 等级
二、创建多语句表值函数
1、在学生信息管理系统中,学生信息表包含列“学号”、列“姓名”;课程信息表包含列“课程代号”、“课程名称”;学生成绩表包含列“学号”、列“课程代号”、列“成绩”,已用约束保证成绩的范围为0~100分。
编写多语句表值函数fn_SexStudent,要求:当性别是“男”,返回男生表,性别是“女”,返回女生表,否则显示所有学生信息。
CREATE FUNCTION fn_SexStudent
(@性别 varchar(8))
RETURNS @sexstudent table
( stu_id char(8) primary key,
stu_name char(10),
stu_sex char(2),
stu_birthday smalldatetime
)
AS
begin
if @性别='男'
insert @sexstudent select * from student where stu_sex='男'
else if @性别='女'
insert @sexstudent select * from student where stu_sex='女'
else
insert @sexstudent select * from student
return
end
2、测试函数fn_SexStudent
select * from dbo.fn_SexStudent('女')
select * from dbo.fn_SexStudent('男')
select * from dbo.fn_SexStudent('全部')
三、创建内嵌表值函数
1、在学生信息管理系统中,学生信息表包含列“学号”、列“姓名”;课程信息表包含列“课程代号”、“课程名称”;学生成绩表包含列“学号”、列“课程代号”、列“成绩”,已用约束保证成绩的范围为0~100分。
编写内嵌表值函数fn_PassStudent,要求:每次输入一个课程号,返回及格(大于等于60分)的学生学号,姓名,本课程的名称和分数。
CREATE FUNCTION fn_PassStudent
(@课程号 varchar(8))
RETURNS TABLE
AS
RETURN (
SELECT a. stu_id,stu_name ,course_name, score FROM student AS a
INNER JOIN score AS b
ON a. stu_id =b. stu_id
INNER JOIN course AS c
ON b. course_id =c. course_id
WHERE b. course_id= @课程号 and score>=60 )
2、测试函数fn_PassStudent select * from fn_PassStudent('005')
控制流:http://www.cnblogs.com/kissdodog/archive/2013/03/10/2953232.html 1、