数据库原理期中测试

更新时间:2023-09-26 14:21:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《数据库原理与应用》期中测验

一、简答题(10分, 5分/题) 1、试述数据模型的三要素。(5分)

答:数据模型的三要素包括数据的基本结构,数据的约束条件和定义在数据上的操作。对于关系型数据库来讲,数据的基本结构是关系或者二维表;数据的约束条件包括实体完整性约束、参照完整性约束和用户自定义的完整性约束条件;定义在关系上的操作包括对数据的增加、删除和修改等。 2、设有供应商关系S和零件关系P,如图所示,S和P的主码分别是“供应商号”和 “零件号”,P的外码是“供应商号”。(5分)

S P

供应商号 供应商名 所在城市 零件号 A1 红星 北京 P1 A2 宇宙 上海 P2 A3 黎明 天津 P3 A4 立新 重庆 分析下列3个操作能否被正确执行,并说明理由。

Ⅰ.在P中插入元组(′P2′,′白′,′A2′) Ⅱ.在P中插入元组(NULL,′绿′,′A1′) Ⅲ.在P中插入元组(′P4′,′白′,′A5′)

答:

(1)不可以,因为P中已经有P2的元组,违反了实体完整性约束。 (2)不可以,因为主键不能为空,违反了实体完整性约束。

(3)不可以,因为‘A5’在S中没有对应的供应商,违反了参照完整性约束。 三、已知下面四个关系模式:

产品(制造厂商,型号,类型)

PC机(型号,CPU速度,RAM容量,硬盘容量,光驱速度和型号,价格) 手提电脑(型号,CPU速度,RAM容量,显示器尺寸,光驱速度和型号,价格)

打印机(型号,是否彩色,处理类型,价格)

其中产品的类型包括PC机、手提电脑或打印机,并假设所有产品型号唯一。打印机的处理类型包括激光、喷墨或点阵。利用关系代数写出如下查询的表达式:(20分, 4分/题)

1、哪些种型号的PC机的CPU速度大于1000?

颜色 红 蓝 白 供应商号 A1 A3 A4 ?型号?cpu速度〉1000(PC机)

2、查询所有生产大于1G的RAM的手提电脑的制造厂商。

?制造厂商?RAM容量?1G(手提电脑)|??|(产品)

(PC机)|??|?制造厂商(产品)?

3、查询厂商B生产的所有产品的型号和价格。

????型号,价格?'B'型号,价格(手提电脑)|??|?制造厂商(打印机)|??|?制造厂商?'B'?'B'(产品)?

型号,价格(产品)

4、查询所有激光打印机的型号。

型号?处理类型?'激光'(打印机)

5、查询价格在9000以下、RAM容量大于120的手提电脑的制造厂商、型号、CPU速度和价格。

?制造厂商,型号,cpu速度,价格?RAM容量?120^价格?9000(手提电脑)|??|(产品)四、基于图书馆数据库的3个表,用SQL语言完成以下数据操作:(20分)

图书(书号,书名,作者,出版社,单价)

读者(读者号,姓名,性别,办公电话,部门,读者类别编号) 借阅(读者号,书号,借出日期,归还日期)

读者类别(读者类别编号,读者类别,允许借阅册数,允许借阅天数) 利用sql语言创建三张表,并定义它们的主键和外键约束。 create table 图书

(

书号 varchar(10) primary key, 书名 varchar(10), 作者 varchar(10), 出版社 varchar(10), 单价 money )

create table 读者类别

(

读者类别编号 varchar(10) primary key, 读者类别 varchar(10), 允许借阅册数 int, 允许借阅天数 int )

第 2 页 共 6 页

create table 读者

(

读者号 varchar(10) primary key, 姓名 varchar(10), 性别 varchar(10), 办公电话 varchar(10), 部门 varchar(10),

读者类别编号 varchar(10) references 读者类别(读者类别编号) )

create table 借阅

(

读者号 varchar(10) references 读者(读者号), 书号 varchar(10) references 图书(书号), 借出日期 datetime, 归还日期 datetime, primary key(读者号,书号)

)

五、利用sql语言完成以下查询(30分,2分/题)

1、向借阅表插入一个借阅记录,表示读者‘王小平’(读者编号为rj450016)借阅了一本书,书号为’TP316/ZW6’,借出日期为当天的日期,归还日期为空值。 insert into 借阅 values('rj450016','TP316/ZW6',getdate(),null) 2、读者‘王小平’在借出上述图书10天之后归还该书。 update 借阅 set 归还日期=dateadd(day,10,借出日期) where 读者号 = 'rj450016' and 书号 = 'TP316/ZW6'

3、当读者‘王小平’按期归还图书时,删除上述借阅记录。 delete from 借阅

from 借阅 join 读者 on 借阅.读者号 = 读者.读者号

join 读者类别 on 读者类别.读者类别编号 = 读者.读者类别编号 where 借阅.读者号 = 'rj450016' and 借阅.书号 = 'TP316/ZW6' and datediff(day,借出日期,getdate()) > 允许借阅天数

4、查询全体图书的图书号、书名、作者、出版社和单价。 select * from 图书

5、查找姓名以‘王’、‘张’或‘李’开头的所有读者的读者号及姓名。 select 读者号,姓名 from 读者 where 姓名 like '[王张李]%'

6、查询单价在20元以上、30元以下的机械工业出版社出版的图书名及单价。 select 书名,单价 from 图书

where 单价 between 20 and 30 and 出版社 = '机械工业出版社' 7、查询机械工业出版社图书的平均价格、最高价、最低价。

第 3 页 共 6 页

select avg(单价),max(单价),min(单价) from 图书

8、查询借阅图书数超过2本的读者号、总本数。并按借阅本数值从大到小排序。 select 读者号,count(*) as 总本数 from 借阅 where 归还日期 is null group by 读者号

having count(*) > 0 order by count(*)

9、查询借阅了机械工业出版社出版、并且书名中包含‘数据库’三个字的图书的读者,并显示读者号、姓名、书名、出版社、借出日期及归还日期。 select 读者.读者号,姓名,书名,出版社,借出日期,归还日期 from 读者 join 借阅 on 读者.读者号 = 借阅.读者号 join 图书 on 借阅.书号 = 图书.书号

where 出版社 = '机械工业出版社' and 书名 like '%数据库%' 10、查询与‘王小平’的办公电话相同的读者的姓名。 select 姓名 from 读者

where 办公电话 in(select 办公电话 from 读者 where 姓名 = '王小平') and 姓名 <> '王小平'

11、查询办公电话为‘88320701’的所有读者的借阅情况,要求包括借阅了图书的读者和没有借阅的读者,显示他们的读者号、姓名、书名及借阅日期。 select 读者.读者号,姓名,书名,借出日期

from 读者 left outer join 借阅 on 读者.读者号 = 借阅.读者号 join 图书 on 借阅.书号 = 图书.书号 where 办公电话 = '88320701'

12、查询‘科学出版社’的图书中单价比‘机械工业出版社’最高单价还高的图书书名及单价。

select 书名,单价 from 图书

where 单价 > (select max(单价) from 图书 where 出版社 = '机械工业出版社') and 出版社 = '科学出版社' 13、查询从未被借阅过的图书信息。

select * from 图书

where 书号 not in (select distinct 书号 from 借阅) --或者

select 图书.* from 图书

left outer join 借阅 on 图书.书号 = 借阅.书号 where 借阅.读者号 is null 14、查询正在借阅的图书信息。 select 图书.* from 图书

join 借阅 on 图书.书号 = 借阅.书号

第 4 页 共 6 页

where 借阅.归还日期 is null

15、查询借阅了机械工业出版社出版的书名中含有‘数据库‘三个字的图书,但没有借阅科学出版社出版的书名中含有‘数据库‘三个字的图书的读者姓名及书名。 select 姓名,书名

from 读者 join 借阅 on 读者.读者号 = 借阅.读者号 join 图书 on 借阅.书号 = 图书.书号

where 出版社 = '机械工业出版社' and 书名 like '%数据库%' and not exists

(select * from 借阅 join 图书 on 借阅.书号 = 图书.书号 where 出版社 = '科学出版社' and 书名 like '%数据库%' and 读者.读者号 = 借阅.读者号)

五、基于上述图书馆的关系模式,完成以下操作。(25分) 1、创建以下视图(5分)

创建视图v1,统计每种类型的读者手中持有的图书册书(即已经借阅还没有归还的图书的总数)。包括读者类型编号,读者类型,借阅册书 create view v1 as

select 读者.读者类别编号,读者类别,count(*) as 借阅册书 from 读者 join 借阅 on 读者.读者号 = 借阅.读者号 join 图书 on 借阅.书号 = 图书.书号

join 读者类别 on 读者类别.读者类别编号 = 读者.读者类别编号 where 归还日期 is null

group by 读者.读者类别编号,读者类别 2、存储过程(15分)

读者可以续借图书,但是每次借阅的图书只能续借一次。试创建续借文献的存储过程p1。

题目有问题,需要添加一列是否续借

alter table 借阅 add 续借次数 smallint default 0 create proc p1(@书号 varchar(10))

as begin update 借阅 set 借出日期 = getdate(),续借次数 = 续借次数 + 1 end

第 5 页 共 6 页

from 借阅 join 读者 on 读者.读者号 = 借阅.读者号

join 读者类别 on 读者类别.读者类别编号 = 读者.读者类别编号 where 借阅.续借次数 = 0 and

datediff(day, 借出日期, getdate()) < 允许借阅天数 and 书号 = @书号

读者借阅图书时,需要查询是否有超期的图书没有归还,如果有则不能继续借阅图书,试创建一存储过程p2完成借阅图书的功能。 create proc p2(@读者号 varchar(10), @书号 varchar(10)) as

begin update 借阅 set 归还日期 = getdate() where 读者号 = @读者号 and 书号 = @书号 and

读者号 not in ( select 读者.读者号

from 读者 join 读者类别 on 读者类别.读者类别编号 = 读者.读者类别编join 借阅 on 借阅.读者号 = 读者.读者号 where 读者.读者号 = @读者号 and

datediff(day, 借阅.借出日期, getdate()) < 读者类别.允许借阅天数

)

end

3、函数(5分)

创建一个函数f1,查询指定读者的借阅图书清单,包括读者姓名,部门,读者类型,书名,出版社,借阅日期,归还日期,输入参数为读者姓名。 create function dbo.f1(@姓名 varchar(10)) returns table as return

(

select 姓名,部门,读者类别,书名,出版社,借出日期,归还日期 from 读者 join 借阅 on 读者.读者号 = 借阅.读者号 join 图书 on 借阅.书号 = 图书.书号

join 读者类别 on 读者类别.读者类别编号 = 读者.读者类别编号 where 姓名 = @姓名 )

第 6 页 共 6 页

本文来源:https://www.bwwdw.com/article/0xqd.html

Top