选择题:(每空2分共20分)
1、在MS SQL Server中,用来显示数据库信息的系统存储过程是( )
A sp_ dbhelp
B sp_ db
C sp_ help
D sp_ helpdb
2、SQL语言中,删除一个表的命令是( )
A DELETE
B DROP
C CLEAR
D REMORE
3、关系数据库中,主键是(__)
A、为标识表中唯一的实体
B、创建唯一的索引,允许空值
C、只允许以表中第一字段建立
D、允许有多个主键的
4、在Transact-SQL语法中,SELECT语句的完整语法较复杂,但至少包括的部分(1___),使用关键字(2___)可以把重复行屏蔽,将多个查询结果返回一个结果集合的运算符是(3___),如果在SELECT语句中使用聚合函数时,一定在后面使用(4___)。
⑴ A、SELECT,INTO
B、SELECT,FROM
C、SELECT,GROUP
D、仅SELECT
⑵ A、
DISTINCT
B、UNION
C、ALL
C、TOP
⑶ A、JOIN
B、UNION
C、INTO
C、LIKE
⑷ A、GROUP BY
B、COMPUTE BY
C、HAVING
D、COMPUTE
5、语句DBCC SHRINKDATABASE (Sample, 25)中的25表示的意思是
A、25M
B、剩余占整个空间的25%
C、已用空间占整个空间的25%
D、以上都不对
6、你是一个保险公司的数据库开发人员,公司的保单信息存储在SQL Server 2000数据库中,你使用以下脚本建立了一个名为Policy的表:
CREATE TABLE Policy
(
PolicyNumber int NOT NULL DEFAULT (0),
InsuredLastName char (30) NOT NULL,
InsuredFirstName char (20) NOT NULL,
InsuredBirthDate datetime NOT NULL,
PolicyDate datetime NOT NULL,
FaceAmount money NOT NULL,
CONSTRAINT PK_Policy PRIMARY KEY (PolicyNumber)
)
每次公司销售出一份保单,Policy表中就增加一条记录,并赋予其一个新的保单号,你将怎么做?
a.建立一个INSTEAD OF INSERT触发器来产生一个新的保单号,并将这个保单号插入数据表中。
b.建立一个INSTEAD OF UPDATE触发器来产生一个新的保单号,并将这个保单号插入数据表中。
c.建立一个AFTER UPDATE触发器来产生一个新的保单号,并将这个保单号插入数据表中。
d.用AFTER UPDATE触发器替代DEFAULT约束条件产生一个新的保单号,并将这个保单号插入数据表中。
7、
在
SQL
语言中,如果要建立一个工资表包含职工号,姓名,职称。工资等字段。若要保证工资
字段
的取值不低于
800
元,最合适的实现方法是:
A
。在创建工资表时为”工资“字段建立缺省
B
。在创建工资表时为”工资“字段建立检查约束
C
。在工资表建立一个触发器
D
。为工资表数据输入编写一个程序进行控制
8、
Select
语句中用来连接字符串的符号是
______.
A.
“
+
”
B.
“
&
”
C.
“
||
”
D.
“
|
”
9、你是一个出版公司的数据库开发人员,对特定的书名的每天的销售情况建立了如下的存储过程:
CREATE PROCEDURE get_sales_for_title
title varchar(80), @ytd_sales int OUTPUT
AS
SELECT @ytd_sales = ytd_sales
FROM titles
WHERE title = @title
IF @@ROWCOUNT = 0
RETURN(-1)
ELSE
RETURN(0)
另外建立了一个脚本执行这个存储过程,如果执行成功,将返回对应于书名的每天的销售情况的报表,如果执行失败,将返回“
No Sales Found
”,怎样建立这个脚本?
A
. DECLARE @retval int
DECLARE @ytd int
EXEC get_sales_for_title ‘Net Etiquette’, @ytd
IF @retval < 0
PRINT ‘No sales found’
ELSE
PRINT ‘Year to date sales: ’ + STR (@ytd)
GO
B
. DECLARE @retval int
DECLARE @ytd int
EXEC get_sales_for_title ‘Net Etiquette’, @ytd OUTPUT
IF @retval < 0
PRINT ‘No sales found’
ELSE
PRINT ‘Year to date sales: ’ + STR (@ytd)
GO
C
. DECLARE @retval int
DECLARE @ytd int
EXEC get_sales_for_title ‘Net Etiquette’,@retval OUTPUT
IF @retval < 0
PRINT ‘No sales found’
ELSE
PRINT ‘Year to date sales: ’ + STR (@ytd)
GO
D
. DECLARE @retval int
DECLARE @ytd int
EXEC @retval = get_sales_for_title ‘Net Etiquette’, @ytd OUTPUT
IF @retval < 0
PRINT ‘No sales found’
ELSE
PRINT ‘Year to date sales: ’ + STR (@ytd)
GO
10、You are a database developer for a container manufacturing company. The containers produced by your company are a number of different sizes and shapes. The tables that store the container information are shown in the Size, Container, and Shape Tables exhibit:
Size
SizeID
SizeName
Height
|
Container
ContainerID
ShapeID
SizeID
|
Shape
ShapeID
ShapeName
Measurements
|
A sample of the data stored in the tables is shown below:
Size Table
SizeID
SizeName Height
1
Small 40
2
Medium 60
3
Large 80
4
Jumbo 100
Shape Table
ShapeID
ShapeName Measurement
1
Triangle 10
2
Triangle 20
3
Triangle 30
4
Square 20
5
Square 30
6
Square 40
7
Circle 15
8
Circle 25
9
Circle 35
Periodically, the dimensions of the containers change. Frequently, the database users require the volume of a container. The volume of a container is calculated based on information in the shape and size tables.
You need to hide the details of the calculation so that the volume can be easily accessed in a SELECT query with the rest of the container information. What should you do?
A.
Create a user-defined function that requires ContainerID as an argument and returns the volume of the container.
B.
Create a stored procedure that requires ContainerID as an argument and returns the volume of the container.
C.
Add a column named volume to the container table. Create a trigger that calculates and stores volume in this column when a new container is inserted into the table.
D.
Add a computed column to the container table that calculates the volume of the container.
填空题(1空1分共20分)
1、 如果设计的表不符合第二范式,可能会导致_______,________,_______。
2、 SQL是由_______语言,________语言,_______语言组成。
3、 SQL Server在两个安全级上验证用户,分别是______________,_____________________。
4、 自定义函数由___________函数,_______________函数,___________________函数组成。
5、 备份策略的三种类型是__________备份,_______________备份,___________________备份组成。
6、 启动一个显式事务的语句为__________,提交事务的语句为__________,回滚事务的语句为__________
7、 表的每一行在表中是惟一的实体属于__________完整性,使列的输入有效属于__________完整性,两个表的主关键字和外关键字的数据应该对应一致属于__________完整性。
简答题(共20分)
1、 在帮助中
[ ,...n ] 意思是什么?(4分)
2、 请简述一下第二范式(4分)
3、 现有1销售表,它们结构如下:(4分)
id int
(标识号)
codno char(7)
(商品编码)
codname varchar(30)
(商品名称)
spec varchar(20)
(商品规格)
price numeric(10,2)
(价格)
sellnum int
(销售数量)
deptno char(3)
(售出分店编码)
selldate datetime
(销售时间)
要求:写出查询销售时间段在2002-2-15日到2002-4-29之间,分店编码是01的所有记录。
4、写一个存储过程,要求传入一个表名,返回该表的记录数(假设传入的表在数据库中都存在)(4分)
5、请简述UPDATE 触发器如何工作原理。(4分)
简答题:(共40分)
1、(5分)
使用一条
SQL
语句找到重复的值及重复的次数:有一数据表
ZD_ks
,其中有字段
BM
,
MC
,。。。,请查询出在
ZD_ks
中
BM
有重复的值及重复的次数,没有的不要列出。如下表:
BM
DUPCOUNT
001
3
002
2
2
、描述
(5
分
)
表
1 student
学生信息表
ID int
学生编号
Name varchar
学生姓名
Sex bit
性别
(
男
0
女
1)
Class int
班级编号
表
2 schedule
课程信息表
ID int
课程编号
Name varchar
课程名称
表
3 Grade
成绩信息表
ID int
自动编号
UID int
学生编号
SID int
课程编号
Num int
考试成绩
(a)
求各班的总人数(1分)
(b)
求
1
班女生和男生的平均成绩(2分)
(c)
各班
"
数据结构
"(
课程名称
)
不及格的人数(2分)
3、问题描述:
(30
分
)
本题用到下面三个关系表:
CARD
借书卡。
CNO
卡号,
NAME
姓名,
CLASS
班级
BOOKS
图书。
BNO
书号,
BNAME
书名
,AUTHOR
作者,
PRICE
单价,
QUANTITY
库存册数
BORROW
借书记录。
CNO
借书卡号,
BNO
书号,
RDATE
还书日期
备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。
要求实现如下
15
个处理:
1
.
找出借书超过
5
本的读者
,
输出借书卡号及所借图书册数。
(2
分
)
2
.
查询借阅了
"
水浒
"
一书的读者,输出姓名及班级。
(3
分
)
3
.
查询过期未还图书,输出借阅者(卡号)、书号及还书日期。
(3
分
)
4
.
查询书名包括
"
网络
"
关键词的图书,输出书号、书名、作者。
(2
分
)
5
.
查询现有图书中价格最高的图书,输出书名及作者。
(2
分
)
6
.
查询当前借了
"
计算方法
"
但没有借
"
计算方法习题集
"
的读者,输出其借书卡号,并按卡号降序排序输出。
(4
分
)
7
.
将
"C01"
班同学所借图书的还期都延长一周。
(2
分
)
8
.
从
BOOKS
表中删除当前无人借阅的图书记录。
(2
分
)
9
.在
BORROW
表上建立一个触发器,完成如下功能:如果读者借阅的书名是
"
数据库技术及应用
"
,就将该读者的借阅记录保存在
BORROW_SAVE
表中(注
ORROW_SAVE
表结构同
BORROW
表)。
(4
分
)
10
.建立一个视图,显示
"
力
01"
班学生的借书信息(只要求显示姓名和书名)。
(3
分
)
11
.查询当前同时借有
"
计算方法
"
和
"
组合数学
"
两本书的读者,输出其借书卡号,并按卡号升序排序输出。
(3
分
)
答案
选择:
1D
2B
3A
4 、⑴B,⑵A,⑶B,⑷A
5、B
6、A
7、
B
8、A
9、D
10、分析
A正确,利用自定义函数可以隐藏计算细节,另外,函数的结果可以作为SELECT查询的列。
B不正确,存储过程不能作为SELECT查询的列。
C不正确,触发器不能创建在SELECT查询的列中。
D不正确,这会造成数据冗余,因为加了一列计算列表就不符合第三范式了。
正确答案:A
填空
1、插入异常,更新异常,删除异常
2、数据定义,数据操纵,数据控制
3、登陆鉴别,对数据库以及角色的许可验证
4、标量函数,内嵌表值型函数,多语句表值函数
5、BEGIN TRANSACTION,COMMIT TRANSACTION ,ROLLBACK TRANSACTION
6、实体,域完整性,参照完整性
简答题:
4、
create Proc getRowCount
@tablename varchar(100)
AS
exec('select count(*) from '+@tablename)
答案
1
、
create table ZD_ks(BM varchar(10),mc varchar(10),age int)
insert into ZD_ks(bm,mc,age) values('001','
张三
',1)
insert into ZD_ks(bm,mc,age) values('001','
李四
',2)
insert into ZD_ks(bm,mc,age) values('001','
王五
',3)
insert into ZD_ks(bm,mc,age) values('002','
赵六
',1)
insert into ZD_ks(bm,mc,age) values('002','
钱七
',2)
insert into ZD_ks(bm,mc,age) values('003','
孙八
',1)
go
select BM,count(*) as DUPCOUNT from zd_ks group by bm having count(*) > 1
drop table zd_ks
2、
(1)
select Class,count(1) as num from student group by Class
(2)
select S.Sex,avg(G.Num) as Num
from student S,Grade G
where S.ID=G.ID and S.Class=1
group by S.Sex
(3)
select S.Class,count(1) as num
from student S,Grade G,schedule SC
where S.ID=G.ID and G.SID =Sc.ID and SC.Name='数据结构' and Sc.Num<60
group by S.Class
3、
1. 找出借书超过5本的读者,输出借书卡号及所借图书册数
--实现代码:
SELECT CNO,借图书册数=COUNT(*)
FROM BORROW
GROUP BY CNO
HAVING COUNT(*)>5
2. 查询借阅了"水浒"一书的读者,输出姓名及班级
--实现代码:
SELECT * FROM CARD c
WHERE EXISTS(
SELECT * FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
AND b.BNAME=N'水浒'
AND a.CNO=c.CNO)
3. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期
--实现代码:
SELECT * FROM BORROW
WHERE RDATE
4. 查询书名包括"网络"关键词的图书,输出书号、书名、作者
--实现代码:
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE BNAME LIKE N'%网络%'
5. 查询现有图书中价格最高的图书,输出书名及作者
--实现代码:
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE PRICE=(
SELECT MAX(PRICE) FROM BOOKS)
6. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出
--实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO AND b.BNAME=N'计算方法'
AND NOT EXISTS(
SELECT * FROM BORROW aa,BOOKS bb
WHERE aa.BNO=bb.BNO
AND bb.BNAME=N'计算方法习题集'
AND aa.CNO=a.CNO)
ORDER BY a.CNO DESC
7. 将"C01"班同学所借图书的还期都延长一周
--实现代码:
UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE)
FROM CARD a,BORROW b
WHERE a.CNO=b.CNO
AND a.CLASS=N'C01'
8. 从BOOKS表中删除当前无人借阅的图书记录
--实现代码:
DELETE A FROM BOOKS a
WHERE NOT EXISTS(
SELECT * FROM BORROW
WHERE BNO=a.BNO)
9. 在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)
--实现代码:
CREATE TRIGGER TR_SAVE ON BORROW
FOR INSERT,UPDATE
AS
IF @@ROWCOUNT>0
INSERT BORROW_SAVE SELECT i.*
FROM INSERTED i,BOOKS b
WHERE i.BNO=b.BNO
AND b.BNAME=N'数据库技术及应用'
10. 建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)
--实现代码:
CREATE VIEW V_VIEW
AS
SELECT a.NAME,b.BNAME
FROM BORROW ab,CARD a,BOOKS b
WHERE ab.CNO=a.CNO
AND ab.BNO=b.BNO
AND a.CLASS=N'力01'
11. 查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出
--实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
AND b.BNAME IN(N'计算方法',N'组合数学')
GROUP BY a.CNO
HAVING COUNT(*)=2
ORDER BY a.CNO DESC