南京理工大学《数据库系统基础教程》试题和答案(二),卓越考研特整理南京理工大学考研真题,为广大考生提供有效的信息支持。
综合题40
一个简化的图书馆信息管理系统。系统需求如下: 1.图书馆有若干管理员librarian,各自有员工号empid、姓名name、身份证号idno等属性。
2.图书馆中备有若干种图书booktype,每种图书有ISBN、名称title、出版社publisher、作者writers、
价格price等属性,每种图书有唯一的ISBN号,同种图书可购入多本。
3.每一本图书book有唯一标记bookid和种类booktype。
4.读者reader在办理借书证后方可借阅。一个读者有唯一的借书证号cardno,还有姓名name、身份证号idno、住址address、注销标记logoff等。读者在注销之前,须归还所有已借图书或报失。
5.需处理以下基本业务:
①借书:在某时刻某读者通过某管理员借阅某一本书。 ②还书:在某时刻通过某管理员归还某一本书。
③报失:在某时刻某读者向某管理员报失某一本书;报失之后该书不能再借。
每一次还书和报失记录都须对应某一次借书记录,且可由不同管理员处理。
按次序回答下列问题:
1.用E/R图建立该系统的数据库模型。为每个实体集确定键属性,并确定每个联系的多重性。(8) 2.由E/R模型建立该系统的关系模式,并确定每个关系的主键和可能的外键。注意各关系中的函数依赖和多值依赖,并使你的关系能符合更高范式。(8) 3.基于以上关系模式,用关系代数表示下面计算:(6) 1) 计算“清华大学出版社”出版的图书名称及作者。 2) 计算借书证号为“A00345”的读者未归还的图书名称。 3) 计算未处理过借书手续的管理员的员工号及其姓名。 4.使用SQL语言实现上述计算,并使输出结果不重复。(6) 5.使用SQL语言完成下面的计算:(12)
1) 增加借书记录: 借书证号为'A00345',通过管理员'E0035'于当前日期借到图书'B00124'。(提示:today(*)函数返回当前日期)
2)还书记录:通过管理员'E0034'于当前日期归还图书'B00124'。(提示:还书无需确认借书证) 3)计算借书证号为“A00345”的读者已借超过30天而未还的图书数量。(提示:days(d1,d2)函数返回从日期d1到d2的天数)
4)计算借书次数最多的读者的姓名和身份证号。(注意使用视图)
5)计算所有图书的ISBN、书名、借阅次数,并按借阅次数从大到小排列。(注意使用外连接)
3.关系代数运算
1) 计算“清华大学出版社”出版的图书名称及作者
πtitle,writers(σpublisher=’清华大学出版社’Booktype)
2) 计算借书证号为“A00345”的读者未归还的图书名称
πtitle(σcardno=’A00345’AND end=NULL(Record∞Book∞Booktype)) 3) 计算未处理过借书手续的管理员的员工号及其姓名。
πempid,name(Librarian) -πempid,name(Librarian∞brwempid=empidRecord)
4.SQL运算
1) 计算“清华大学出版社”出版的图书名称及作者
Select title,writers From Booktype Where publisher=’清华大学出版社’; 2) 计算借书证号为“A00345”的读者未归还的图书名称
Select title
From Record Natural Join Book Natural Join Booktype Where cardno=’A00345’ AND "end" IS NULL; 3) 计算未处理过借书手续的管理员的员工号及其姓名。
Select empid,name From Librarian
Where empid NOT IN(Select brwempid From Record); 5.SQL
1) 增加借书记录: 借书证号为'A00345',通过管理员'E0035'于当前日期借到图书'B00124'。(提示:today(*)函数返回当前日期)
insert into record(brwempid, cardno,bookid,borrowdate) values('E0035','A00345','B00124',today(*));
2) 还书记录:通过管理员'E0034'于当前日期归还图书'B00124'。(提示:还书无需确认借书证)
update record set "end" = 1, enddate= today(*),endempid='E0034' where recid =
(select recid from record where bookid='B00124' and "end" IS NULL); 3) 计算借书证号为“A00345”的读者已借超过30天而未还的图书数量。(提示:days(d1,d2)函数返回从日期d1到d2的天数)
Select Count(recid) From Record
Where cardno='A00345' AND "end" IS NULL
AND days(borrowdate,today(*))>30;
4) 计算借书次数最多的读者的姓名和身份证号。(注意使用视图)
Create view brwtimes as
select cardno,count(recid) as times from record group by cardno select name,idno
from reader natural join brwtimes
where times=(select max(times) from brwtimes);