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 DUPCOUNT001 3002 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)goselect BM,count(*) as DUPCOUNT from zd_ks group by bm having count(*) > 1drop 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<GETDATE() 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