数据库基本语言操作实验
作者:互联网
二、 实验内容
(一)创建数据库和模式
1、通过 SQL 语句创建图书信息管理数据库,命名为“db_Library”,数据文件和日志文件放在 D 盘下以自己学号和姓名命名的文件夹中,数据文件的逻辑名为 db_Library_data,数据文件的物理名为 db_Library_data.mdf,文件初始大小为 10MB,最大可增加至 300MB,增幅为 10%;日志文件的逻辑名为 db_Library_log,日志文件的物理名为 db_Library_data.ldf,文件初始大小为 5MB,最大可增加至 200MB,增幅为 2MB。(参照 SQL Server 2008 联机丛书)
2、通过SQL 语句在该数据库中创建模式 L_C。
(二)创建和管理数据表
要求为各数据表的字段选择合适的数据类型及名称;为各数据表设置相应的完整性约束条件。
1、通过SQL 语句将以下数据表创建在L_C 模式下:
课程信息表(tb_course)——课程编号、课程名、先修课、学分
2、通过SQL 语句将以下数据表创建在该数据库的默认模式 dbo 下: 图书类别信息表(tb_booktype)——类别编号、类别名称
图书信息表(tb_book)——图书编号、类别编号、书名、作者、出版社、定价、库存数读者信息表(tb_reader)——读者编号、姓名、性别、学号、班级、系部
借阅信息表(tb_borrow)——图书编号、读者编号、借阅日期、归还日期
3、通过SQL 语句对读者信息表进行修改:删除系部字段、添加所在系字段。
4、通过SQL 语句对图书信息表进行修改:将定价的数据类型改为 REAL。
5、通过SQL 语句删除课程信息表。
(三)创建和删除索引
1、使用 SQL 语句在图书信息表上创建一个聚簇索引 IX_S_QUANTITY,要求按照该表中库存数字段的降序创建。
2、使用 SQL 语句在读者信息表上创建一个唯一的索引 IX_S_NAME,要求按照该表中的姓名字段的升序创建。
3、使用SQL 语句删除之前创建的两个索引。
(四)数据库及数据表设计
根据周围的实际应用情况,自选一个小型的数据库应用项目进行研究,完成该系统的设计。通过需求分析,列出系统的主要功能,并完成该系统数据库的逻辑结构设计。例如可选择学籍管理系统、企业进销存管理系统、人事管理系统或在线考试系统等。
(五)数据查询
通过 SSMS 向各数据表中添加以下记录。
- 图书类别信息表
类别编号 | 类别名称 | 类别编号 | 类别名称 | 类别编号 | 类别名称 |
1 | 数学 | 4 | 文学 | 7 | 建筑 |
2 | 英语 | 5 | 艺术 | 8 | 化学 |
3 | 计算机 | 6 | 电子信息 | 9 | 物理 |
- 图书信息表
图书编号 | 类别编号 | 书名 | 作者 | 出版社 | 定价 | 库存数 |
10001 | 3 | 数据库管理 | 王珊 | 高等教育出版社 | 35.50 | 10 |
10002 | 3 | 软件测试 | 贺平 | 机械工业出版社 | 24.60 | 5 |
10003 | 3 | C++程序设计 | 谭浩强 | 清华大学出版社 | 30.00 | 8 |
10004 | 4 | 红楼梦 | 曹雪芹 | 人民文学出版社 | 70.00 | 5 |
10005 | 4 | 西游记 | 罗贯中 | 人民文学出版社 | 60.00 | 8 |
10006 | 4 | 红与黑 | 司汤达 | 人民文学出版社 | 50.00 | 5 |
10007 | 1 | 高等数学 | 李翼 | 清华大学出版社 | 28.00 | 4 |
10008 | 8 | 有机化学 | 张翔 | 高等教育出版社 | 29.00 | 5 |
10009 | 2 | 大学英语 | 王琳 | 高等教育出版社 | 25.00 | 10 |
10010 | 2 | 英语教程 | 王琳 | 高等教育出版社 | 25.00 | 5 |
- 读者信息表
读者编号 | 姓名 | 性别 | 学号 | 班级 | 所在系 |
R10001 | 张小航 | 男 | 1351101 | 13511 | 计算机系 |
R10002 | 王文广 | 女 | 1351102 | 13511 | 计算机系 |
R10003 | 李理 | 女 | 1351103 | 13511 | 计算机系 |
R10004 | 李彦宏 | 男 | 1351201 | 13512 | 计算机系 |
R10005 | 张丽霞 | 女 | 1351202 | 13512 | 计算机系 |
R10006 | 王强 | 男 | 1221104 | 12211 | 电子系 |
R10007 | 张宝田 | 男 | 1221204 | 12212 | 电子系 |
R10008 | 宋文霞 | 女 | 1261104 | 12611 | 建工系 |
R10009 | 刘芳菲 | 女 | 1381104 | 13811 | 外语系 |
R10010 | 常江宁 | 男 | 1381204 | 13812 | 外语系 |
- 借阅信息表
图书编号 | 读者编号 | 借阅日期 | 归还日期 |
10002 | R10003 | 2014-9-20 | 2014-10-20 |
10003 | R10003 | 2014-9-20 | 2014-10-20 |
10004 | R10003 | 2014-9-30 | 2014-10-30 |
10009 | R10003 | 2014-9-30 | 2014-10-30 |
10009 | R10007 | 2014-5-20 | 2014-6-20 |
10010 | R10007 | 2014-5-20 | 2014-6-20 |
10009 | R10009 | 2014-5-30 | 2014-6-30 |
10010 | R10009 | 2014-5-22 | 2014-6-22 |
10002 | R10009 | 2014-5-22 | 2014-6-22 |
10003 | R10009 | 2014-5-30 | 2014-6-30 |
对以上数据表,完成以下操作:
- 查询每本图书的所有信息;
- 查询每个读者的读者编号、姓名和班级;
- 查询每条借阅记录的借阅天数(函数 DATEDIFF 获取两个日期的差);
- 查询被借阅过的图书的图书编号;
- 查询图书编号为“10006”的书名和作者;
- 查询库存数在 5 到 10 本之间的图书的图书编号和书名;
- 查询计算机系或电子系姓张的读者信息;
- 查询书名包括“英语”的图书信息;
- 统计男读者、女读者的人数;
- 统计各类图书的类别编号、平均定价以及库存总数;
- 统计每本书籍借阅的人数,要求输出图书编号和所借人数,查询结果按人数降序排列;
- 查询有库存的各类别图书的类别编号、类别名称和借阅数量;
- 查询借阅了“大学英语”一书的读者,输出读者姓名、性别、系部;
- 查询每个读者的读者编号、姓名、所借图书编号以及所借阅日期;(LEFT OUTER JOIN)
- 查询现有图书中价格最高的图书,输出书名、作者、定价;
- 查询借阅了“大学英语”但没有借阅“C++程序设计”的读者,输出读者姓名、性别、系部;
- 统计借阅了 2 本以上图书的读者信息;
- 查询借阅了“大学英语”一书或者借阅了“C++程序设计”一书的读者信息;(用集合查询完成)
- 查询既借阅了“大学英语”一书又借阅了“C++程序设计”一书的读者信息;(用集合查询完成)
- 查询计算机系中比其他系所有读者借书数量都多的读者的信息;
- 在读者信息表中插入一条新的记录(读者编号:R10011;姓名:张三;所在系:电子系);
- 定义一个表 tb_bknew,包含图书编号、书名和类别名称字段,要求将类别编号为“3” 的图书的图书编号、书名和类别名称插入到 tb_bknew 表中;
- 将类别编号为“3”的所有图书的库存数增加 5;
- 将“C++程序设计”这本书的归还日期增加一个月(函数DATEADD)。
- 删除姓名为“张三”的读者的信息;
- 删除 tb_bknew 表中的所有数据;
- 创建一个名为“读者借阅信息_VIEW”的视图,要求显示计算机系所有读者的借阅信息 ,包括读者编号、姓名、所在系、图书编号、书名和借阅日期等字段,更新该视图时要保证只有计算机系的读者借阅信息;
- 创建一个名为“图示借阅信息_VIEW”的视图,要求显示图书的借阅情况,包括图书编号、书名、库存数、借阅次数字段;
- 查询借阅次数大于 2 的图书的图书编号、书名、库存数和借阅次数;
- 删除“图示借阅信息_VIEW”视图。
use master
go
create database db_Library
on primary
(
name=db_library_data,
filename="D:\xx\db_library_data.mdf",
size=10MB,
maxsize=200MB,
filegrowth=10%
)
log on
(
name=db_library_log,
filename="D:\xx\db_library_data.ldf",
size=5MB,
maxsize=200MB,
filegrowth=2MB
)
go
use db_library
go
create schema L_C
go
create table L_C.tb_course
(
课程编号 int,
课程名 varchar(20),
先修课 varchar(20),
学分 int,
)
go
create table dbo.tb_booktype
(
类别编号 int,
类别名称 varchar(20),
)
go
create table dbo.tb_book
(
图书编号 int,
类别编号 varchar(20),
书名 varchar(20),
作者 varchar(20),
出版社 varchar(20),
定价 float,
库存数 int,
)
go
create table dbo.tb_reader
(
读者编号 varchar(20),
姓名 varchar(20),
性别 varchar(20),
学号 int,
班级 varchar(20),
系部 varchar(20),
)
go
create table dbo.tb_borrow
(
图书编号 varchar(20),
读者编号 varchar(20),
借阅日期 date,
归还日期 date,
)
go
alter table dbo.tb_reader drop column 系部
alter table dbo.tb_reader add 系部 varchar(20)
alter table dbo.tb_book alter column 定价 real
drop table L_C.tb_course
go
create clustered index IX_S_QUANTITY on dbo.tb_book(库存数 desc)
create unique index IX_S_NAME on dbo.tb_reader(姓名 asc)
drop index dbo.tb_book.IX_S_QUANTITY
drop index dbo.tb_reader.IX_S_NAME
go
insert into dbo.tb_booktype values(1,'数学')
insert into dbo.tb_booktype values(2,'英语')
insert into dbo.tb_booktype values(3,'计算机')
insert into dbo.tb_booktype values(4,'文学')
insert into dbo.tb_booktype values(5,'艺术')
insert into dbo.tb_booktype values(6,'电子信息')
insert into dbo.tb_booktype values(7,'建筑')
insert into dbo.tb_booktype values(8,'化学')
insert into dbo.tb_booktype values(9,'物理')
go
insert into dbo.tb_book values(10001,3,'数据库管理','王珊','高等教育出版社',35.50,10)
insert into dbo.tb_book values(10002,3,'软件测试','贺平','机械工业出版社',24.60,5)
insert into dbo.tb_book values(10003,3,'c++程序设计','谭浩强','清华大学出版社',30.00,8)
insert into dbo.tb_book values(10004,4,'红楼梦','曹雪芹','人民文学出版社',70.00,5)
insert into dbo.tb_book values(10005,4,'西游记','罗贯中','人民文学出版社',60.00,8)
insert into dbo.tb_book values(10006,4,'红与黑','司汤达','人民文学出版社',50.00,5)
insert into dbo.tb_book values(10007,1,'高等数学','李翼','清华大学出版社',28.00,4)
insert into dbo.tb_book values(10008,8,'有机化学','张翔','高等教育出版社',29.00,5)
insert into dbo.tb_book values(10009,2,'大学英语','王琳','高等教育出版社',25.00,10)
insert into dbo.tb_book values(10010,2,'英语教程','王琳','高等教育出版社',25.00,5)
go
insert into dbo.tb_reader values('R10001','张小航','男',1351101,13511,'计算机系')
insert into dbo.tb_reader values('R10002','王文广','女',1351102,13511,'计算机系')
insert into dbo.tb_reader values('R10003','李强','女',1351103,13511,'计算机系')
insert into dbo.tb_reader values('R10004','李彦宏','男',1351101,13512,'计算机系')
insert into dbo.tb_reader values('R10005','张丽霞','女',1351102,13512,'计算机系')
insert into dbo.tb_reader values('R10006','王强','男',1351104,12211,'电子系')
insert into dbo.tb_reader values('R10007','张宝田','男',1351104,12212,'电子系')
insert into dbo.tb_reader values('R10008','宋文霞','女',1351104,12611,'建工系')
insert into dbo.tb_reader values('R10009','刘芳菲','女',1351104,13811,'外语系')
insert into dbo.tb_reader values('R10010','常江宁','男',1351104,13812,'外语系')
go
insert into dbo.tb_borrow values(10002,'R10003','2014-09-20','2014-10-20')
insert into dbo.tb_borrow values(10003,'R10003','2014-09-20','2014-10-20')
insert into dbo.tb_borrow values(10004,'R10003','2014-09-30','2014-10-30')
insert into dbo.tb_borrow values(10009,'R10003','2014-09-30','2014-10-30')
insert into dbo.tb_borrow values(10009,'R10007','2014-05-20','2014-06-20')
insert into dbo.tb_borrow values(10010,'R10007','2014-05-20','2014-06-20')
insert into dbo.tb_borrow values(10009,'R10009','2014-05-30','2014-06-30')
insert into dbo.tb_borrow values(10010,'R10009','2014-05-22','2014-06-22')
insert into dbo.tb_borrow values(10002,'R10009','2014-05-22','2014-06-22')
insert into dbo.tb_borrow values(10003,'R10009','2014-05-30','2014-06-30')
go
(1)查询每本图书的所有信息
select * from dbo.tb_book
(2)查询每个读者的读者编号、姓名和班级
select 读者编号,姓名,班级
from
dbo.tb_reader
(3)查询每条借阅记录的借阅天数(函数 DATEDIFF 获取两个日期的差);
select datediff(day,借阅日期,归还日期)as 借阅天数
from
dbo.tb_borrow
(4)查询被借阅过的图书的图书编号;
select 图书编号
from
dbo.tb_borrow
(5)查询图书编号为“10006”的书名和作者;
select 书名,作者
from
dbo.tb_book
where 图书编号=10006
(6)查询库存数在 5 到 10 本之间的图书的图书编号和书名;
select 图书编号,书名
from dbo.tb_book
where 库存数 between 5 and 10
(7)查询计算机系或电子系姓张的读者信息;
select *
from dbo.tb_reader
where 姓名 like '张%'
(8)查询书名包括“英语”的图书信息;
select *
from dbo.tb_book
where 书名 like '%英语%'
(9)统计男读者、女读者的人数;
select 性别,count(性别) as 人数
from dbo.tb_reader
group by 性别
10)统计各类图书的类别编号、平均定价以及库存总数;
select 类别编号,avg(定价)as 平均定价,sum(库存数)
from dbo.tb_book
group by 类别编号
(11)统计每本书籍借阅的人数,要求输出图书编号和所借人数,查询结果按人数降序排列;
select 图书编号,count(读者编号)as 借阅人数
from dbo.tb_borrow
group by 图书编号
order by 借阅人数 desc
(12)查询有库存的各类别图书的类别编号、类别名称和借阅数量;
select dbo.tb_book.类别编号,dbo.tb_booktype.类别名称,count(*)as 借阅数量
from dbo.tb_booktype,dbo.tb_borrow,dbo.tb_book
where dbo.tb_booktype.类别编号=dbo.tb_book.类别编号 and dbo.tb_book.图书编号=dbo.tb_borrow.图书编号
group by dbo.tb_book.类别编号,dbo.tb_booktype.类别名称
(13)查询借阅了“大学英语”一书的读者,输出读者姓名、性别、系部;
select 姓名,性别,系部
from dbo.tb_reader
where 读者编号 in(select 读者编号 from dbo.tb_borrow where 图书编号 in(select 图书编号 from dbo.tb_book where 书名='大学英语'))
(14)查询每个读者的读者编号、姓名、所借图书编号以及所借阅日期;(LEFT OUTER JOIN)
select dbo.tb_reader.读者编号, 姓名,dbo.tb_borrow.图书编号,dbo.tb_borrow.借阅日期
from dbo.tb_reader left outer join dbo.tb_borrow on(dbo.tb_reader.读者编号=dbo.tb_borrow.读者编号)
(15)查询现有图书中价格最高的图书,输出书名、作者、定价;
select 书名,作者,定价
from dbo.tb_book
where 定价 >=all (select 定价 from dbo.tb_book)
select 书名,作者,定价
from dbo.tb_book
where 定价 =(select max(定价) from dbo.tb_book)
(16)查询借阅了“大学英语”但没有借阅“C++程序设计”的读者,输出读者姓名、性别、
系部;
select 姓名,性别,系部
from dbo.tb_reader
where 读者编号 in (select 读者编号 from dbo.tb_borrow where 图书编号 in (select 图书编号 from dbo.tb_book where 书名='大学英语'))
and 读者编号 not in(select 读者编号 from dbo.tb_borrow where 图书编号 in (select 图书编号 from dbo.tb_book where 书名='c++程序设计'))
(17)统计借阅了 2 本以上图书的读者信息;
select *from
dbo.tb_reader
where dbo.tb_reader.读者编号 in(select 读者编号 from dbo.tb_borrow group by 读者编号 having count(*)>2)
(18)查询借阅了“大学英语”一书或者借阅了“C++程序设计”一书的读者信息;(用集合查
询完成)找到读者编号就能查询
select
*from dbo.tb_reader
where 读者编号 in(select 读者编号 from dbo.tb_borrow where 图书编号 in(select 图书编号 from dbo.tb_book where 书名='大学英语'))
union
select
*from dbo.tb_reader
where 读者编号 in(select 读者编号 from dbo.tb_borrow where 图书编号 in(select 图书编号 from dbo.tb_book where 书名='c++程序设计'))
(19)查询既借阅了“大学英语”一书又借阅了“C++程序设计”一书的读者信息;(用集合查
询完成)找到读者编号就能查询
select *from
dbo.tb_reader
where 读者编号 in(select 读者编号 from dbo.tb_borrow where 图书编号 in(select 图书编号 from dbo.tb_book where 书名='大学英语'))
intersect
select *from
dbo.tb_reader
where 读者编号 in(select 读者编号 from dbo.tb_borrow where 图书编号 in (select 图书编号 from dbo.tb_book where 书名='c++程序设计'))
(20)查询计算机系中比其他系所有读者借书数量都多的读者的信息;
select *from
dbo.tb_reader
where 系部='计算机系'and 读者编号 in(select
dbo.tb_reader.读者编号 from dbo.tb_reader,dbo.tb_borrow where dbo.tb_reader.读者编号=dbo.tb_borrow.读者编号
group by dbo.tb_reader.读者编号 having count(图书编号)>any(select count(图书编号)from
dbo.tb_reader,dbo.tb_borrow where dbo.tb_reader.读者编号=dbo.tb_borrow.读者编号 and 系部<>'计算机系'group by dbo.tb_reader.读者编号))
(21)在读者信息表中插入一条新的记录(读者编号:R10011;姓名:张三;所在系:电子系);
insert into
dbo.tb_reader(读者编号,姓名,系部)
values('R10011','张三','电子系')
(22)定义一个表 tb_bknew,包含图书编号、书名和类别名称字段,要求将类别编号为“3” 的图书的图书编号、书名和类别名称插入到 tb_bknew 表中;
create table tb_bnew
(
图书编号 int,
书名 varchar(20),
类别名称 varchar(20)
)
insert into tb_bnew
select dbo.tb_book.图书编号,dbo.tb_book.书名,dbo.tb_booktype.类别名称
from dbo.tb_booktype,dbo.tb_book
where dbo.tb_book.类别编号=3 and dbo.tb_book.类别编号=dbo.tb_booktype.类别编号
(23)将类别编号为“3”的所有图书的库存数增加 5;
update dbo.tb_book
set 库存数=库存数+5
where 类别编号=3
(24)将“C++程序设计”这本书的归还日期增加一个月(函数 DATEADD)。
update dbo.tb_borrow
set 归还日期=DATEADD(month,1,归还日期)
where 图书编号 in(select 图书编号 from dbo.tb_book where 书名='c++程序设计')
(25)删除姓名为“张三”的读者的信息;
delete from
dbo.tb_reader
where 姓名='张三'
(26)删除 tb_bknew 表中的所有数据;
delete from tb_bnew
(27)创建一个名为“读者借阅信息_VIEW”的视图,要求显示计算机系所有读者的借阅信息,
包括读者编号、姓名、所在系、图书编号、书名和借阅日期等字段,更新该视图时要保证只有计算
机系的读者借阅信息;
go
create view 读者借阅信息_view(读者编号,姓名,系部,图书编号,书名,借阅日期)
as
select dbo.tb_reader.读者编号,姓名,系部,dbo.tb_book.图书编号,dbo.tb_book.书名,借阅日期
from dbo.tb_reader,dbo.tb_borrow,dbo.tb_book
where dbo.tb_book.图书编号=dbo.tb_borrow.图书编号 and dbo.tb_reader.读者编号=dbo.tb_borrow.读者编号 and 系部='计算机系'
with check option
go
(28)创建一个名为“图示借阅信息_VIEW”的视图,要求显示图书的借阅情况,包括图书编
号、书名、库存数、借阅次数字段;
go
create view 图书借阅信息view(图书编号,书名,库存数,借阅次数)
as
select dbo.tb_book.图书编号,书名,库存数,count(*)
from dbo.tb_book,dbo.tb_borrow
where dbo.tb_book.图书编号=dbo.tb_borrow.图书编号
group by dbo.tb_book.图书编号,书名,库存数
go
(29)查询借阅次数大于 2 的图书的图书编号、书名、库存数和借阅次数;
select *from
图书借阅信息view
where 借阅次数>2
(30)删除“图示借阅信息_VIEW”视图
drop view _view
标签:语言,dbo,数据库,实验,读者,编号,借阅,tb,图书 来源: https://blog.csdn.net/weixin_52913841/article/details/120576434