图书管理 增删改查 sql全语句

图书管理 增删改查 sql全语句


大学平时作业实操。
知识点:建表 增删改查 触发器 存储过程

create database 图书馆管理信息系统
on primary
(name='图书馆管理',
filename = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER2\MSSQL\DATA\图书馆管理.mdf',
size = 5MB,
filegrowth = 1024KB
)
log on
(name='图书馆管理_log',
filename ='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER2\MSSQL\DATA\图书馆管理_log.ldf',
size = 5MB,
filegrowth=1024KB
)
EXEC sp_changedbowner 'sa'


--图书现有库存表
CREATE table 图书现有库存表
(图书ID int not null primary key,
书号 varchar(50) not null,--索书号
书名 nvarchar(20) not null,
作者 nvarchar(100),
简介 nvarchar(max),
类别 nvarchar(20) default '未知',
价格 money default 20,
出版社 nvarchar(20) default '某出版社',
出版日期 nvarchar(50),
入库时间 datetime,
现有库存数量 int default 0,
库存总量 int default 0,
最小库存量 int default 1,
库存位置 nvarchar(20) default '图书馆东南角'
)

select * from 图书现有库存表
update 图书现有库存表 set 书号 ='TP311.561/78' where 书号='TP311.561'


--读者信息表
create table 读者信息表
(
	读者ID int not null primary key,
	证件类型 nvarchar(20) default '居民身份证' check (证件类型 in ('居民身份证','港澳台胞通行证','士官证','学生证','驾驶证','护照','其他')),
	证件号码 nchar(20),
	姓名 nvarchar(20),
	职业 nvarchar(10) default '学生' check (职业 in ('教师','学生','教工','其他')),
	是否受限 bit default 0,
	书本借阅数量 tinyint default 0 check(书本借阅数量<=10 and 书本借阅数量>=0 ),
	所属单位 nvarchar(100) default '安财',
	地址 nvarchar(100) default '曹山路962号',
	联系电话 char(20) default '10086'
)


create table 借书登记表
(
借书ID int not null,
图书ID int not null,
读者ID int not null,
借阅数量 tinyint default 1 check(借阅数量=1),
借阅日期 datetime  default getdate() not null,
应还日期 datetime default dateadd(d,45,getdate()),
是否归还 bit default 0,
是否续借 bit default 0,
primary key(借书ID),
foreign key (图书ID) references 图书现有库存表(图书ID),
foreign key (读者ID) references 读者信息表(读者ID),
)


create table 还书登记表
(
还书ID int not null,
图书ID int not null,
读者ID int not null,
归还数量 tinyint default 1 check(归还数量=1),
归还日期 datetime default getdate() not null ,
是否超期 bit  default 0,
超期天数 int default 0,
primary key(还书ID),
foreign key (图书ID) references 图书现有库存表(图书ID),
foreign key (读者ID) references 读者信息表(读者ID),
)

--入库单表
create table 入库单表
(
入库单ID int not null primary key,
入库日期 smalldatetime,
图书ID int,
入库书号 varchar(20),
书名 nvarchar(20),
入库数量 int check (入库数量>=1),
foreign key (图书ID) references 图书现有库存表(图书ID),
);

go
--创建存储过程,按“书号”(参数)查询该图书的库存信息
 create  procedure 书号查询
@书号 varchar(50)
as
begin
if (exists(select * from 图书现有库存表 where 书号 = @书号))
    begin
	   select *
	   from 图书现有库存表
	   where 书号 = @书号
    end
else begin
   print '书库中不存在此书,请重新核对书号'
   rollback transaction
   end
end
go

execute  书号查询 'K0/30'
execute  书号查询 100
go

--创建存储过程,按“类别”(参数)查询该类图书的库存信息、借阅量。

create proc 类别查询
@类别 nvarchar(20)
as
begin
if((exists(select * from 图书现有库存表 where 类别 = @类别)))
	select 库存总量-现有库存数量 借阅量,* from 图书现有库存表 where 类别 = @类别
else
begin
   print '书库中不存在此类别,请重新核对类别'
   rollback transaction
   end
end

execute 类别查询 100
execute 类别查询 K0

go


--创建存储过程,按“读者编号”(参数)查询读者个人信息
 create  procedure 读者编号查询
@读者ID int
as
begin
if (exists(select * from 读者信息表 where 读者ID = @读者ID))
    begin
	   select *
	   from 读者信息表
	   where 读者ID = @读者ID
    end
else begin
   print '该表中不存在该读者,请检查'
   rollback transaction
   end
end

execute 读者编号查询 100--无此人
execute 读者编号查询 1001--有此人

go
--创建存储过程,按“读者编号”(参数)查询该读者借阅情况
create  procedure 借书查询
@读者ID varchar(50)
as
begin
if (exists(select * from 借书登记表 where 读者ID = @读者ID))
    begin
	   select *
	   from 借书登记表
	   where 读者ID = @读者ID
	end
else if (exists(select * from 读者信息表 where 读者ID = @读者ID))
	begin
	print'该读者没有借阅记录'
	end
else
	begin
	print'无此读者,请检查输入'
	end
end

execute 借书查询 1001
execute 借书查询 1002
execute 借书查询 100

drop trigger 借书
go
 create trigger 借书  on 借书登记表
after insert
as
begin

	declare @BORROW as int,@BOOKID as int
	declare @READERID as int,@borrow_count as int
	declare @BOOK_ALL as int
	declare @READER_BOOKS as int
	declare @MIN_BOOKS as int
	declare @flag as int

	select	@BORROW=inserted.借书ID,
			@BOOKID=inserted.图书ID,
			@READERID=inserted.读者ID,
			@BOOK_ALL=图书现有库存表.现有库存数量,
			@MIN_BOOKS=图书现有库存表.最小库存量
	from inserted join 图书现有库存表 on inserted.图书ID=图书现有库存表.图书ID
	--该读者的阅读记录表
	select @flag=0
	select @READER_BOOKS=书本借阅数量 from 读者信息表 where 读者ID=@READERID

	-- 是否借过这本书还没还
	select @borrow_count=0
	select @borrow_count=sum(借阅数量) from 借书登记表
		where 是否归还=0 and @READERID=读者ID and  @BOOKID=图书ID

	if(exists(select * from 读者信息表 where  @READERID=读者ID and 是否受限=1))
		begin
		print'请交罚款,解除限制'
		select @flag=1
		rollback transaction
		end

	if(@READER_BOOKS>=10)
		begin
		print'借阅图书超出10本,请及时归还!'
		select @flag=1
		rollback transaction
		end
	if(@borrow_count>=1)
		begin
		print'您已借阅该书,不可再借'
		select @flag=1
		rollback transaction
		end
	if(@BOOK_ALL<1)
		begin
		print'该书已无库存'
		select @flag=1
		rollback transaction
		end



	if(@borrow_count<=@BOOK_ALL and @flag=0)
		begin
		update 图书现有库存表 set 现有库存数量 = 现有库存数量-1 where 图书现有库存表.图书ID=@BOOKID
		update 读者信息表 set 书本借阅数量=书本借阅数量+1 where 读者ID=@READERID

		if(@MIN_BOOKS>=(select 图书现有库存表.现有库存数量 from 图书现有库存表 where 图书现有库存表.图书ID=@BOOKID))
			begin
				print'当前此图书库存量告急!'
			end
		end

end
go

drop trigger 还书
go
create trigger 还书 on 还书登记表
after insert
as
begin
	declare @BORROW as int,@BOOKID as int
	declare @READERID as int,@borrow_count as int
	declare @BOOK_ALL as int
	declare @READER_BOOKS as int
	declare @MIN_BOOKS as int
	declare @num as int
	declare @date as datetime
	declare @day as datetime
	declare @flag as int
	select	@BORROW=inserted.还书ID,
			@BOOKID=inserted.图书ID,
			@READERID=inserted.读者ID,
			@BOOK_ALL=图书现有库存表.现有库存数量,
			@MIN_BOOKS=图书现有库存表.最小库存量
	from inserted join 图书现有库存表 on inserted.图书ID=图书现有库存表.图书ID
	select @num=归还数量 from	inserted
	select @BORROW=借书ID from 借书登记表  where 图书ID=@BOOKID and 读者ID=@READERID
	select @date=应还日期 from 借书登记表 where 读者ID=@READERID and 图书ID=@BOOKID and 是否归还=0
	select @flag =0
	--判断读者id合法性

	if(not exists(select * from 读者信息表 where @READERID=读者ID))
		begin
		print'无此读者,请检查后重试'
		select @flag =1
		rollback transaction
		end
	--判断图书id的合法性
	if(not exists (select  * from 借书登记表 where @BOOKID=图书ID and 是否归还=0))
		begin
		print'无此书的借阅记录,请检查后重试'
		select @flag =1
		rollback transaction
		end


if(@flag!=1)
begin
	update 图书现有库存表  set 现有库存数量=现有库存数量+@num  where 图书ID=@BOOKID
	update 借书登记表 set 是否归还=1 where 图书ID=@BOOKID and 读者ID=@READERID
	update 读者信息表 set 书本借阅数量=书本借阅数量-1 where  读者ID=@READERID


	--交罚款,改受限
	if(datediff(day,@date,GETDATE())>0)
		begin
		update 还书登记表 set 是否超期=1 where 	还书ID=(select 还书ID from inserted)
		update 还书登记表 set 超期天数 =datediff(day,@date,getdate())	where 	还书ID=(select 还书ID from inserted)
		update 读者信息表 set 是否受限=1 where 读者ID=@READERID
		print'还书超期!请交罚款!'
		end
	print'操作完成!'
end
end
go



猜你喜欢

转载自blog.csdn.net/Hoshea_H/article/details/121487930