简易图书数据库管理系统

简易图书管理数据库(假定数据库名为:BooksDB)包含4个关系(即:数据表)。关系名、属性及说明分别如下述各表所示。

读者类别表:ReaderType

序号

字段名

数据类型

说明

1

rdType

int

读者类别号【主键】

2

rdTypeName

varchar(20)

读者类别名称

3

canLendQty

int

可借书数量

4

canLendDay

int

可借书天数

读者信息表:Reader

序号

字段名

数据类型

说明

1

rdID

char(9)

读者编号【主键】

2

rdType

int

读者类别号【外键,非空】

3

rdName

varchar(20)

读者姓名

4

rdDept

varchar (40)

读者单位

5

rdQQ

varchar (13)

读者QQ

6

rdBorrowQty

int

已借书数量(默认值0,取值范围0~10)

图书信息表:Book

序号

字段名

数据类型

说明

1

bkID

char(9)

书号【主键】

2

bkName

varchar(50)

书名

3

bkAuthor

varchar(50)

作者

4

bkPress

varchar(50)

出版社

5

bkPrice

decimal(5,2)

单价

6

bkStatus

int

是否在馆(1:在馆,0:不在馆)

借阅信息表:Borrow

序号

字段名

数据类型

说明

2

rdID

char(9)

读者编号【外键】

(rdID, bkID) 是主键

1

bkID

char(9)

书号 【外键】

3

DateBorrow

DateTime

借书日期

4

DateLendPlan

DateTime

应还日期

3

DateLendAct

DateTime

实际还书日期

建表语句

-- 创建数据库
create database BooksDB;

-- 选择BooksDB数据库
use BooksDB;

-- 创建读者类别表 ReaderType
create table ReaderType(
	rdType int primary key comment "读者类别号(主键)",
	rdTypeName varchar(20) comment "读者类别名称",
	canLendDty int comment "可借书数量",
	canLendDay int comment "可借书天数"
);

select * from readertype;

-- 创建读者信息表 Reader
create table Reader(
	rdID char(9) primary key comment "读者编号",
	rdType int not null comment "类别号(外键)",
	rdName varchar(20) comment "姓名",
	rdDept varchar(40) comment "单位",
	rdQQ varchar(13) comment "QQ",
	rdBorrowQty int default 0 check (rdBorrowQty between 0 and 10) comment "已借书数量(默认值0,取值范围0-10)",
	foreign key(rdType) references ReaderType(rdType)
);


-- 创建图书信息表 Book
create table Book(
	bkId char(9) primary key comment "书号",
	bkName varchar(50) comment "书名",
	bkAuthor varchar(50) comment "作者",
	bkPress varchar(50) comment "出版社",
	bkPrice decimal(5,2) comment "单价",
	bkStatus int default 1 comment "是否在馆(1:在馆,0:不在馆)"
);

-- 借阅信息表 Borrow
create table Borrow(
	rdID char(9) comment "读者编号",
	bkID char(9) comment "书号",
	DateBorrow datetime comment "借书日期",
	DateLendPlan datetime comment "应还日期",
	DateLendAct datetime comment "实际还书日期",
	primary key(rdID,bkID),
	foreign key(rdID) references Reader(rdID),
	foreign key(bkID) references Book(bkID)
);

insert into ReaderType values 
(1, '教师', 10, 60),
(2, '本科生', 5, 30),
(3, '硕士研究生', 6, 40),
(4, '博士研究生', 8, 50);

insert into Reader values 
('rd2017001', 1, '王桃群', '计算机科学学院', 3635751, 10),
('rd2017002', 2, '孙小美', '英语学院', 11223344, 5),
('rd2017003', 3, '连晓燕', '管理学院', 55996633, 3),
('rd2017004', 4, '许苗', '物理学院', 88552277, 0);


insert into Book values 
('bk2017001', '数据库原理及应用', '王丽艳', '机械工业出版社', 33.00, 1),
('bk2017002', '高等数学', '同济学数学系', '高等教育出版社', 32.00, 1),
('bk2017003', '当代教育心理学', '陈琦', '北京师范学出版社', 37.20, 1),
('bk2017004', '古代汉语', '王力', '中华书局', 20.40, 1);

insert into Borrow values
('rd2017001', 'bk2017002', '2022-5-11', '2021-5-18', '2021-10-17'),
('rd2017001', 'bk2017003', '2021-9-11', '2021-10-18', '2021-10-17'),
('rd2017001', 'bk2017004', '2022-10-11', '2022-10-18', '2022-10-17'),
('rd2017002', 'bk2017001', '2022-4-11', '2022-5-8', '2022-4-18'),
('rd2017002', 'bk2017003', '2022-2-11', '2022-8-18', '2022-3-17'),
('rd2017003', 'bk2017001', '2022-1-11', '2022-6-18', '2022-5-17'),
('rd2017004', 'bk2017001', '2022-2-11', '2022-5-18', '2022-4-17');

查询语句

-- 针对简易图书管理数据库BooksDB,用SQL命令完成以下单表查询。
-- 1、查询所有读者的编号和姓名;
select rdID,rdName from reader;

-- 2、查询所有读者的编号、姓名和单位,要求修改查询结果的列名;
select rdId as 编号,rdname as 姓名,rdDept as 单位
from reader;

-- 3、查询Reader表的全部列
select * from reader;

-- 4、查询借阅过图书的读者的编号;
select distinct rdId from Borrow
where DateBorrow is not null;

-- 5、查询单价于30元的图书的书号和书名;
select bkID,bkName from Book
where bkPrice > 30;

-- 6、查询单价不在30至40元之间的图书的书号、书名和作者;
select * from Book;
select bkID,bkName,bkAuthor
from Book
where bkPrice not between 30 and 40;

-- 7、查询既不是管理学院、也不是物理学院的读者的姓名和QQ;
select * from Reader;
select rdName,rdQQ
from Reader
where rdDept not in('管理学院','物理学院');

-- 8、分别使用like 和 regexp查询所有姓“王”的读者的姓名、单位和QQ;
select rdName,rdDept,rdQQ
from Reader
where rdName like '王%';

select rdName,rdDept,rdQQ
from Reader
where rdName regexp '^王';

-- 9、分别使用like 和 regexp查询查询所有不姓“王”的读者的姓名、单位和QQ;
select rdName,rdDept,rdQQ
from Reader
where rdName not like '王%';

select rdName,rdDept,rdQQ
from Reader
where rdName not regexp '^王';

-- 10、查询所有全名只有两个字的读者的姓名、单位和QQ;
select rdName,rdDept,rdQQ
from Reader
where rdName like'__';

-- 11、查询所有图书还未归还的借阅信息;
select *
from Borrow
where DateLendAct is null;

-- 12、查询借阅了书号“bk2017001”的读者的编号和借书日期,查询结果按借书日期降序排列;
select rdID,DateBorrow
from Borrow
where bkId = 'bk2017001'
order by DateBorrow desc;

-- 13、查询读者的总人数;
select count(*) from Reader;

-- 14、查询借阅过图书的读者人数;
select count(rdID) from Reader
where rdBorrowQty !=0;

-- 15、查询所有图书的最高单价;
select max(bkPrice) from Book;

-- 16、查询各单位名及该单位的读者人数;
select rdDept,count(rdID)
from Reader
group by rdDept;

-- 17、查询读者人数于40的单位名及该单位的读者人数;
select rdDept,count(rdID)
from Reader
group by rdDept
having count(rdID)>40;