0720 01-04 數據庫BOOK/Wage/Student/Library

  1. 使用sql腳本創建學校圖書館借書信息管理系統的三個表:

數據庫名:BOOK

學生信息表:student

字段名稱

數據類型

說明

stuID

char(10)

學生編號,主鍵

stuName

Varchar(10)

學生名稱

major

Varchar(50)

專業

圖書表:book

字段名稱

數據類型

說明

BID

char(10)

圖書編號,主鍵

title

char(50)

書名

author

char(20)

作者

借書信息表:borrow

字段名稱

數據類型

說明

borrowID

char(10)

借書編號,主鍵

stuID

char(10)

學生編號,外鍵

BID

char(10)

圖書編號,外鍵

T_time

datetime

借書日期

B_time

datetime

還書日期

2、向表中插入以下測試數據

--學生信息表中插入數據--

INSERT INTO student(stuID,stuName,major)VALUES('1001','林林','計算機')

INSERT INTO student(stuID,stuName,major)VALUES('1002','白楊','計算機')

INSERT INTO student(stuID,stuName,major)VALUES('1003','虎子','英語')

INSERT INTO student(stuID,stuName,major)VALUES('1004','北漂的雪','工商管理')

INSERT INTO student(stuID,stuName,major)VALUES('1005','五月','數學')

--圖書信息表中插入數據--

INSERT INTO book(BID,title,author)VALUES('B001','人生若只如初見','安意如')

INSERT INTO book(BID,title,author)VALUES('B002','入學那天遇見你','晴空')

INSERT INTO book(BID,title,author)VALUES('B003','感謝折磨你的人','如娜')

INSERT INTO book(BID,title,author)VALUES('B004','我不是教你詐','劉庸')

INSERT INTO book(BID,title,author)VALUES('B005','英語四級','白雪')

--借書信息表中插入數據--

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T001','1001','B001','2007-12-26',null)

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T002','1004','B003','2008-1-5',null)

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T003','1005','B001','2007-10-8','2007-12-25')

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T004','1005','B002','2007-12-16','2008-1-7')

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T005','1002','B004','2007-12-22',null)

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T006','1005','B005','2008-1-6',null)

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T007','1002','B001','2007-9-11',null)

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T008','1005','B004','2007-12-10',null)

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T009','1004','B005','2007-10-16','2007-12-18')

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T010','1002','B002','2007-9-15','2008-1-5')

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T011','1004','B003','2007-12-28',null)

INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T012','1002','B003','2007-12-30',null)

3、請編寫SQL語句完成以下的功能:

  1. 顯示出“計算機”專業學生在“2007-12-15”至“2008-1-8”時間段內借書的學生編號、學生名稱、圖書編號、圖書名稱、借出日期;參考查詢結果如下圖所示:

  1. 查詢所有借過圖書的學生編號、學生名稱、專業;參考查詢結果如下圖所示:

  1. 定義存儲過程,實現查詢任意作者的圖書補借閱的情況,例如借過作者爲“安意如”的圖書的學生姓名、圖書名稱、借出日期、歸還日期;參考查詢結果如下圖所示:

  1. 查詢目前借書但未歸還圖書的學生名稱及未還圖書數量;參考查詢結果如下圖所示:

create database book

use book

--學校圖書館借書信息管理系統
/*
學生信息表:student
字段名稱	數據類型	說明
stuID	char(10)	學生編號,主鍵
stuName	Varchar(10)	學生名稱
major	Varchar(50)	專業
*/

create table  student(
stuID	char (10)	 primary key, --學生編號
  stuName varchar(10),--學生名稱
  major varchar(50) --專業
)

/*
圖書表:book
字段名稱	數據類型	說明
BID	char(10)	圖書編號,主鍵
title	char(50)	書名
author	char(20)	作者
*/
create table book(
  BID char(10) primary key,--圖書編號,
  title char(50),--書名
  author char(20) --作者
)

/*
借書信息表:borrow
字段名稱	數據類型	說明
borrowID	char(10)	借書編號,主鍵
stuID	char(10)	學生編號,外鍵
BID	char(10)	圖書編號,外鍵
T_time	datetime	借書日期
B_time	datetime	還書日期
*/

create table borrow(
   borrowID	char(10) primary key, --借書編號
   stuID	char(10),	--學生編號 外鍵 
  BID	char(10),--圖書編號 外鍵
  T_time	datetime	,--借書日期 
  B_time	datetime	--還書日期
)

--爲 borrow 表添加外鍵
alter table borrow
  add constraint fk_borrow_student foreign key( stuID)
  references student(stuID)
  
  
 alter table borrow
   add constraint fk_borrow_book foreign key(BID)
  references book(BID)  
  
  
  --向三個表中添加數據
  --學生信息表中插入數據--
INSERT INTO student(stuID,stuName,major)VALUES('1001','林林','計算機')
INSERT INTO student(stuID,stuName,major)VALUES('1002','白楊','計算機')
INSERT INTO student(stuID,stuName,major)VALUES('1003','虎子','英語')
INSERT INTO student(stuID,stuName,major)VALUES('1004','北漂的雪','工商管理')
INSERT INTO student(stuID,stuName,major)VALUES('1005','五月','數學')
 
--圖書信息表中插入數據--
INSERT INTO book(BID,title,author)VALUES('B001','人生若只如初見','安意如')
INSERT INTO book(BID,title,author)VALUES('B002','入學那天遇見你','晴空')
INSERT INTO book(BID,title,author)VALUES('B003','感謝折磨你的人','如娜')
INSERT INTO book(BID,title,author)VALUES('B004','我不是教你詐','劉庸')
INSERT INTO book(BID,title,author)VALUES('B005','英語四級','白雪') 

--借書信息表中插入數據--
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T001','1001','B001','2007-12-26',null)
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T002','1004','B003','2008-1-5',null)
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T003','1005','B001','2007-10-8','2007-12-25')
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T004','1005','B002','2007-12-16','2008-1-7')
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T005','1002','B004','2007-12-22',null)
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T006','1005','B005','2008-1-6',null)
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T007','1002','B001','2007-9-11',null)
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T008','1005','B004','2007-12-10',null)
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T009','1004','B005','2007-10-16','2007-12-18')
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T010','1002','B002','2007-9-15','2008-1-5')
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T011','1004','B003','2007-12-28',null)
INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T012','1002','B003','2007-12-30',null)


select * from student 
select * from book
select * from borrow




--顯示出“計算機”專業學生在“2007-12-15”至“2008-1-8”時間段內借書的
--學生編號、學生名稱、圖書編號、圖書名稱、借出日期;參考查詢結果如下圖所示:
select s.stuID '學生編號',s.stuName '學生姓名',bk.BID '圖書編號',bk.title '圖書名稱',br.T_time '借出日期'
from student s inner join borrow br
on s.stuID = br.stuID inner join book bk
on br.BID = bk.BID
where s.major = '計算機' and br.t_time between '2007-12-15' and '2008-1-8'

select * from student
select * from borrow

--2)查詢所有借過圖書的學生編號、學生名稱、專業;參考查詢結果如下圖所示:
--方法一
select distinct  s.stuID '學生編號',s.stuName '學生名稱',s.major '學生專業'
from student s left join borrow br
on s.stuID= br.stuID
where br.t_time is not null

--方法二
select distinct  s.stuID '學生編號',s.stuName '學生名稱',s.major '學生專業'
from student s inner join borrow br
on s.stuID= br.stuID

/*
3)定義存儲過程,實現查詢任意作者的圖書補借閱的情況,
例如借過作者爲“安意如”的圖書的學生姓名、圖書名稱、借出日期、
歸還日期;參考查詢結果如下圖所示:
*/

create procedure proc_borrowInfo
  @author varchar(100)
as
  select s.stuName '學生姓名',bk.title '圖書名稱',br.t_time '借出日期',br.b_time '歸還日期'
  from Student  s inner join borrow br
  on s.stuID = br.stuID inner join book bk
  on br.BID = bk.BID
  where bk.author = @author
go

exec  proc_borrowInfo '安意如'

--查詢目前借書但未歸還圖書的學生名稱及未還圖書數量;參考查詢結果如下圖所
--方法一
select max(s.stuName) '學生姓名' ,COUNT(*) '未還圖書數量'
from student s inner join borrow br
on s.stuID = br.stuID
where br.b_time is null
group by s.stuID

--方法二
select s.stuName '學生姓名' ,COUNT(*) '未還圖書數量'
from student s inner join borrow br
on s.stuID = br.stuID
where br.b_time is null
group by s.stuName


 

  1. 使用sql腳本創建員工信息管理系統的一個表:

數據庫名:Wage

程序員工資表:ProWage

字段名稱

數據類型

說明

ID

int

自動編號,主鍵

PName

Char(10)

程序員姓名

Wage

int

工資

2、向表中插入以下測試數據:

INSERT INTO ProWage(PName,Wage)VALUES('青青',1900)

INSERT INTO ProWage(PName,Wage)VALUES('張三',1200)

INSERT INTO ProWage(PName,Wage)VALUES('李四',1800)

INSERT INTO ProWage(PName,Wage)VALUES('二月',3500)

INSERT INTO ProWage(PName,Wage)VALUES('藍天',2780)

3、請編寫T-SQL來實現如下功能:

  1. 創建一個存儲過程,對程序員的工資進行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,給所有人加薪,每次加100,再進行分析,直到有一半以上的人大於2000元爲止,存儲過程執行完後,最終加了多少錢?

例如:如果有百分之五十的人薪水不到2000,給所有人加薪,每次加100元,直到有一半以上的人工資大於2000元,調用存儲過程後的結果如圖:

  1. 創建存儲過程,查詢程序員平均工資是否低於4500元,如果不到則每個程序員每次加200元,至到所有程序員的平均工資達到4500元。調用存儲過程後的結果如圖:

create database Wage

use Wage
/*
程序員工資表:ProWage
字段名稱	數據類型	說明
ID	int	自動編號,主鍵
PName	Char(10)	程序員姓名
Wage	int	工資
*/

create table ProWage(
   ID int identity(1,1) primary key,
  PName  char(10),--程序員姓名
  Wage int --工資 
)
drop table ProWage
--2、向表中插入以下測試數據:
INSERT INTO ProWage(PName,Wage)VALUES('青青',1900)
INSERT INTO ProWage(PName,Wage)VALUES('張三',1200)
INSERT INTO ProWage(PName,Wage)VALUES('李四',1800)
INSERT INTO ProWage(PName,Wage)VALUES('二月',3500)
INSERT INTO ProWage(PName,Wage)VALUES('藍天',2780)

/*
1)創建一個存儲過程,對程序員的工資進行分析,月薪1500到10000不等,
如果有百分之五十的人薪水不到2000元,給所有人加薪,每次加100,
再進行分析,直到有一半以上的人大於2000元爲止,存儲過程執行完後,
最終加了多少錢? 
*/
drop procedure proc_add_wage
create procedure proc_add_wage
as
  declare @num float  --工資大於等於2000的人數
  declare @total float --總人數
  declare @rate float = 0 -- 工資超過2000的人所佔的比例.
  declare @sal1 int --加薪前的總工資
  declare @sal2 int --加薪後的總工資
  
  --獲得加薪前的總工資
  select @sal1 = SUM(Wage)
  from ProWage
  
  
  --程序員的總數
  select @total = COUNT(*)
  from ProWage
  
  --工資超過2000的人數
   select @num = COUNT(*)
  from ProWage
  where Wage >=2000
  --加薪前薪資超過2000的人所佔比例
  set @rate = @num/@total
  
  while(@rate<0.5)
  begin 
    update ProWage set Wage = Wage +100
  --加薪後再計算比例 
  select @num = COUNT(*)
  from ProWage
  where Wage >=2000
  set @rate = @num/@total
  end
  --獲得加薪後的總工資
  select @sal2 =sum(Wage)
  from ProWage
 
  print '一共加薪:'+convert(varchar(20),@sal2-@sal1)
  print '加薪後的程序員工資列表:'
  select * from ProWage
go

select * from ProWage

 exec proc_add_wage

/*
2)創建存儲過程,查詢程序員平均工資是否低於4500元,
如果不到則每個程序員每次加200元,至到所有程序員的平均工資達到4500元。
調用存儲過程後的結果如圖:
*/ 

create procedure proc_add_sal2
as
  declare @avgSal float --員工的平均薪資
  declare @sal1 int --加薪前的總工資
  declare @sal2 int --加薪後的總工資
  
  --獲得加薪前的總工資
  select @sal1 = SUM(wage)
  from ProWage
  
  --當前的平均薪資
  select @avgSal = AVG(Wage)
  from ProWage
  
  while(@avgSal<4500)
  begin
    --加薪
     update ProWage set wage = wage + 200
    --加薪後再求平均工資
    select @avgSal = AVG(Wage)
   from ProWage
  end
  --獲得加薪後的總工資
  select @sal2 = SUM(Wage)
  from ProWage
  
   print '一共加薪:'+convert(varchar(20),@sal2-@sal1)
   print '加薪後,平均薪水爲:'+convert(varchar(20),@avgSal)
   print '加薪後的程序員工資列表:'
  select * from ProWage    
go

exec  proc_add_sal2

 

 

  1. 使用sql腳本創建學生成績信息三個表,結構如下: 

數據庫名:Student

學生表:Member

字段名稱

數據類型

說明

MID

Char(10)

學生號,主鍵

MName

Char(50)

姓名

課程表:F

字段名稱

數據類型

說明

FID

Char(10)

課程,主鍵

FName

Char(50)

課程名

成績表:Score

字段名稱

數據類型

說明

SID

int

自動編號,主鍵,成績記錄號

FID

Char(10)

課程號,外鍵

MID

Char(10)

學生號,外鍵

Score

int

成績

2、向表中插入以下測試數據

--課程表中插入數據--

INSERT INTO F(FID,FName)VALUES('F001','語文')

INSERT INTO F(FID,FName)VALUES('F002','數學')

INSERT INTO F(FID,FName)VALUES('F003','英語')

INSERT INTO F(FID,FName)VALUES('F004','歷史')

--學生表中插入數據--

INSERT INTO Member(MID,MName)VALUES('M001','張薩')

INSERT INTO Member(MID,MName)VALUES('M002','王強')

INSERT INTO Member(MID,MName)VALUES('M003','李三')

INSERT INTO Member(MID,MName)VALUES('M004','李四')

INSERT INTO Member(MID,MName)VALUES('M005','陽陽')

INSERT INTO Member(MID,MName)VALUES('M006','虎子')

INSERT INTO Member(MID,MName)VALUES('M007','夏雪')

INSERT INTO Member(MID,MName)VALUES('M008','璐璐')

INSERT INTO Member(MID,MName)VALUES('M009','珊珊')

INSERT INTO Member(MID,MName)VALUES('M010','香奈兒')

--成績表中插入數據--

INSERT INTO Score(FID,MID,Score)VALUES('F001','M001',78)

INSERT INTO Score(FID,MID,Score)VALUES('F002','M001',67)

INSERT INTO Score(FID,MID,Score)VALUES('F003','M001',89)

INSERT INTO Score(FID,MID,Score)VALUES('F004','M001',76)

INSERT INTO Score(FID,MID,Score)VALUES('F001','M002',89)

INSERT INTO Score(FID,MID,Score)VALUES('F002','M002',67)

INSERT INTO Score(FID,MID,Score)VALUES('F003','M002',84)

INSERT INTO Score(FID,MID,Score)VALUES('F004','M002',96)

INSERT INTO Score(FID,MID,Score)VALUES('F001','M003',70)

INSERT INTO Score(FID,MID,Score)VALUES('F002','M003',87)

INSERT INTO Score(FID,MID,Score)VALUES('F003','M003',92)

INSERT INTO Score(FID,MID,Score)VALUES('F004','M003',56)

INSERT INTO Score(FID,MID,Score)VALUES('F001','M004',80)

INSERT INTO Score(FID,MID,Score)VALUES('F002','M004',78)

INSERT INTO Score(FID,MID,Score)VALUES('F003','M004',97)

INSERT INTO Score(FID,MID,Score)VALUES('F004','M004',66)

INSERT INTO Score(FID,MID,Score)VALUES('F001','M006',88)

INSERT INTO Score(FID,MID,Score)VALUES('F002','M006',55)

INSERT INTO Score(FID,MID,Score)VALUES('F003','M006',86)

INSERT INTO Score(FID,MID,Score)VALUES('F004','M006',79)

INSERT INTO Score(FID,MID,Score)VALUES('F002','M007',77)

INSERT INTO Score(FID,MID,Score)VALUES('F003','M008',65)

INSERT INTO Score(FID,MID,Score)VALUES('F004','M007',48)

INSERT INTO Score(FID,MID,Score)VALUES('F004','M009',75)

INSERT INTO Score(FID,MID,Score)VALUES('F002','M009',88)

3、請編寫T-SQL語句來實現如下功能:

  1. 查詢四門課中成績低於70分的學生及相對應課程名和成績。

  1. 統計各個學生參加考試課程的平均分,且按平均分數由高到底排序。

  1. 創建存儲過程,分別查詢參加了1、2、3、4門考試的學生名單,要求顯示姓名、學號。

use test_sql_adv

/*
學生表:Member
字段名稱	數據類型	說明
MID	Char(10)	學生號,主鍵
MName	Char(50)	姓名
*/

create table Member(
 MID	Char(10)	primary key, --學生編號
MName	Char(50)  --學生姓名
)

/*
課程表:F
字段名稱	數據類型	說明
FID	Char(10)	課程,主鍵
FName	Char(50)	課程名
*/

create table F(
  FID	Char(10) primary key,--課程編號
  FName Char(50) -- 課程名
)

/*
成績表:Score
字段名稱	數據類型	說明
SID	int	自動編號,主鍵,成績記錄號
FID	Char(10)	課程號,外鍵
MID	Char(10)	學生號,外鍵
Score	int	成績
*/

create table Score(
  SID	int identity(1,1) primary key,
  FID	Char(10),--課程號
  MID	Char(10),--學生號
  Score int --成績
)

--添加外鍵
alter table Score 
  add constraint fk_score_student foreign key(MID)
  references Member(MID)
  
alter table Score
   add constraint fk_score_F foreign key(FID)
  references F(FID)   
  
  --課程表(F)中插入數據--
INSERT INTO F(FID,FName)VALUES('F001','語文')
INSERT INTO F(FID,FName)VALUES('F002','數學')
INSERT INTO F(FID,FName)VALUES('F003','英語')
INSERT INTO F(FID,FName)VALUES('F004','歷史')

--學生表(Student)中插入數據--
INSERT INTO Member(MID,MName)VALUES('M001','張薩')
INSERT INTO Member(MID,MName)VALUES('M002','王強')
INSERT INTO Member(MID,MName)VALUES('M003','李三')
INSERT INTO Member(MID,MName)VALUES('M004','李四')
INSERT INTO Member(MID,MName)VALUES('M005','陽陽')
INSERT INTO Member(MID,MName)VALUES('M006','虎子')
INSERT INTO Member(MID,MName)VALUES('M007','夏雪')
INSERT INTO Member(MID,MName)VALUES('M008','璐璐')
INSERT INTO Member(MID,MName)VALUES('M009','珊珊')
INSERT INTO Member(MID,MName)VALUES('M010','香奈兒')

--成績表(Score)中插入數據--
INSERT INTO Score(FID,MID,Score)VALUES('F001','M001',78)
INSERT INTO Score(FID,MID,Score)VALUES('F002','M001',67)
INSERT INTO Score(FID,MID,Score)VALUES('F003','M001',89)
INSERT INTO Score(FID,MID,Score)VALUES('F004','M001',76)
INSERT INTO Score(FID,MID,Score)VALUES('F001','M002',89)
INSERT INTO Score(FID,MID,Score)VALUES('F002','M002',67)
INSERT INTO Score(FID,MID,Score)VALUES('F003','M002',84)
INSERT INTO Score(FID,MID,Score)VALUES('F004','M002',96)
INSERT INTO Score(FID,MID,Score)VALUES('F001','M003',70)
INSERT INTO Score(FID,MID,Score)VALUES('F002','M003',87)
INSERT INTO Score(FID,MID,Score)VALUES('F003','M003',92)
INSERT INTO Score(FID,MID,Score)VALUES('F004','M003',56)
INSERT INTO Score(FID,MID,Score)VALUES('F001','M004',80)
INSERT INTO Score(FID,MID,Score)VALUES('F002','M004',78)
INSERT INTO Score(FID,MID,Score)VALUES('F003','M004',97)
INSERT INTO Score(FID,MID,Score)VALUES('F004','M004',66)
INSERT INTO Score(FID,MID,Score)VALUES('F001','M006',88)
INSERT INTO Score(FID,MID,Score)VALUES('F002','M006',55)
INSERT INTO Score(FID,MID,Score)VALUES('F003','M006',86)
INSERT INTO Score(FID,MID,Score)VALUES('F004','M006',79)
INSERT INTO Score(FID,MID,Score)VALUES('F002','M007',77)
INSERT INTO Score(FID,MID,Score)VALUES('F003','M008',65)
INSERT INTO Score(FID,MID,Score)VALUES('F004','M007',48)
INSERT INTO Score(FID,MID,Score)VALUES('F004','M009',75)
INSERT INTO Score(FID,MID,Score)VALUES('F002','M009',88)

--1)查詢四門課中成績低於70分的學生及相對應課程名和成績。
set nocount on
select m.MName '姓名',F.FName '課程名',s.Score '成績'
from Member m inner join Score s
on m.MID= s.MID inner join F f
on s.FID = f.FID
where s.score<70

--2)統計各個學生參加考試課程的平均分,且按平均分數由高到底排序。
--方法一.
select MAX(m.MName) '姓名',AVG(s.Score) '平均分'
from Member m inner join Score s
on m.MID = s.MID
group by m.MID
order by '平均分' desc

--方法二
select m.MName '姓名',AVG(s.Score) '平均分'
from Member m inner join Score s
on m.MID = s.MID
group by m.MName
order by AVG(s.Score) desc

--3)創建存儲過程,分別查詢參加了1、2、3、4門考試的學生名單,要求顯示姓名、學號。
create procedure proc_testInfo
  @num int
as
   select max(m.MName) '姓名',m.MID '學號'
   from Member m inner join Score s
   on m.MID = s.MID
   group by m.MID
   having count(s.score) =@num
go

create procedure proc_show_testInfo
as
  declare @num int = 1
  while(@num<=4)
  begin
     exec proc_testInfo @num
      set @num =@num +1 
  end
go


exec proc_show_testInfo

 

 

  1. 使用sql腳本創建學校圖書館借書信息管理系統的三個表:

數據庫名:Library

學生信息表:Reader

字段名稱

數據類型

說明

RID

varchar(50)

讀者編號,主鍵,非空

RName

varchar(50)

讀者姓名,非空

LendNum

int

借書數量,必須大於0,非空

圖書表:Book

字段名稱

數據類型

說明

BID

varchar(50)

圖書編號,主鍵,要求以ISBN開頭,非空

BName

varchar(50)

書名,非空

Author

varchar(20)

作者,非空

PubComp

varchar(20)

出版社,非空

PubDate

datetime

出版時間,必須小於當前時間,非空

BCount

int

剩餘數量,必須大於或者等於1,非空

Price

float

單價,必須大於0,非空

借書信息表:Borrow

字段名稱

數據類型

說明

RID

varchar(50)

讀者編號,外鍵,引用讀者表,非空

BID

varchar(50)

圖書編號,外鍵,引用圖書表, 非空

LendDate

datetime

借書日期,默認爲當前時間, 非空

ReturnDate

datetime

實際歸還日期,可以爲空

2、向表中插入以下測試數據

--圖書表中插入數據--

INSERT INTO Book VALUES('ISBN001','java','cay s.horstmann','jixiegongye',02-02-90, 100,200.0)

INSERT INTO Book VALUES('ISBN002','.net','cay s.horstmann','jixiegongye',03-03-90, 200,240.0) 

--讀者表中插入數據--

INSERT INTO Reader VALUES('001','zhangYongwei','1')

INSERT INTO Reader VALUES('002','zhangDawei','2') 

--借書信息表中插入數據--

INSERT INTO Borrow(RID,BID) VALUES('001','ISBN001')

INSERT INTO Borrow(RID,BID) VALUES ('002','ISBN002')

3、請編寫SQL語句完成以下的功能:

  1. 使用case-end結構顯示書籍的價格等級參考查詢,結果如下圖所示:

  1. 定義存儲過程,查詢顯示圖書表的所有圖書總額,每本書的總金額=單價*數量,並統計所有圖書的現存數量,如果現存數量不足10000本,則提示’現有圖書不足一萬本,還需要繼續購置書籍’,否則,提示’現有圖書在一萬本以上,需要管理員加強圖書管理’;參考查詢結果如下圖所示:

  1. 定義存儲過程,輸入讀者名和書名完成借書過程,先要向Borrow表中插入一條借閱記錄,再將Book表對應圖書的剩餘數量減1,同時Reader表對應的讀者信息的借書數量也要加1,整個過程應用事務控制。例如,zhangYongwei借閱了.net書籍。參考查詢結果如下圖所示:

create database  test_sql_adv2
use test_sql_adv2

/*
學生信息表:Reader
字段名稱	數據類型	說明
RID	varchar(50)	讀者編號,主鍵,非空
RName	varchar(50)	讀者姓名,非空
LendNum	int	借書數量,必須大於0,非空
*/

create table Reader(
 RID	 varchar(50) primary key, --讀者編號
 RName varchar(50) not null,--讀者姓名
 LendNum int not null check(LendNum>0)	--借書數量
)

/*
圖書表:Book
字段名稱	數據類型	說明
BID	varchar(50)	圖書編號,主鍵,要求以ISBN開頭,非空
BName	varchar(50)	書名,非空
Author	varchar(20)	作者,非空
PubComp	varchar(20)	出版社,非空
PubDate	datetime	出版時間,必須小於當前時間,非空
BCount	int	剩餘數量,必須大於或者等於1,非空
Price	float	單價,必須大於0,非空
*/
create table book(
 BID	 varchar(50) primary key check (BID like 'ISBN%'),--圖書編號
 BName	varchar(50)	 not null,--書名
 Author	varchar(20)	 not null,--作者
 PubComp	varchar(20)	 not null,--出版社
 PubDate	datetime	not null check(PubDate<getdate()),--出版時間
 BCount int not null  check(BCount>=1),--剩餘數量 
 Price	float not null check(Price>0) -- 單價
)

/*
借書信息表:Borrow
字段名稱	數據類型	說明
RID	varchar(50)	讀者編號,外鍵,引用讀者表,非空
BID	varchar(50)	圖書編號,外鍵,引用圖書表, 非空
LendDate	datetime	借書日期,默認爲當前時間, 非空
ReturnDate	datetime	實際歸還日期,可以爲空
*/
create table Borrow(
  RID	varchar(50)	 not null,--讀者編號
  BID	varchar(50)	 not null,--圖書編號
  LendDate	datetime not null default(getdate()),--借書日期
  ReturnDate	datetime --還書日期
)

--添加Borrow表的外鍵
alter table Borrow
 add constraint fk_borrow_reader foreign key(RID)
 references  Reader(RID)

 alter table Borrow
   add constraint fk_borrow_book foreign key(BID)
  references book(BID)  
  
  --圖書表中插入數據--
INSERT INTO Book VALUES('ISBN001','java','cay s.horstmann','jixiegongye',02-02-90, 100,200.0)
INSERT INTO Book VALUES('ISBN002','.net','cay s.horstmann','jixiegongye',03-03-90, 200,240.0) 
--INSERT INTO Book VALUES('ISBN003','php','cay s.horstmann','jixiegongye',03-03-90, 200,120.0) 
delete from book where BID  = 'ISBN003'

--讀者表中插入數據--
INSERT INTO Reader VALUES('001','zhangYongwei','1')
INSERT INTO Reader VALUES('002','zhangDawei','2') 

--借書信息表中插入數據--
INSERT INTO Borrow(RID,BID) VALUES('001','ISBN001')
INSERT INTO Borrow(RID,BID) VALUES ('002','ISBN002')



--1)使用case-end結構顯示書籍的價格等級參考查詢,結果如下圖所示:
set nocount on
select BID,BName,case 
       when Price>=200 then '價格偏貴'
       when Price>=100 then '價格適中'
       else '價格便宜'
end  as '價格'
from book

/*
2)定義存儲過程,查詢顯示圖書表的所有圖書總額,
每本書的總金額=單價*數量,並統計所有圖書的現存數量,
如果現存數量不足10000本,則提示’現有圖書不足一萬本,
還需要繼續購置書籍’,否則,提示’現有圖書在一萬本以上,
需要管理員加強圖書管理’;參考查詢結果如下圖所示:
*/

create procedure proc_book_static
as
 declare @count int --總數量
 declare @totalPrice float --總金額 
  
  --獲得書籍總數量,總金額
  select @count = sum(BCount),@totalPrice = SUM(Bcount*price)
  from book 
  
   print '現存數量:'+convert(varchar(20),@count)
   print '總金額:'+convert(varchar(20),@totalPrice)
  
   if(@count<10000)
   begin
      print '現有圖書不足一萬本,還需要繼續購置書籍.'
   end
   else
  begin
     print '現有圖書在一萬本以上,需要管理員加強圖書管理'
  end      
go

exec proc_book_static

select * from Borrow
select * from book
select * from Reader

/*
定義存儲過程,輸入讀者名和書名完成借書過程,
先要向Borrow表中插入一條借閱記錄,再將Book表對應圖書的剩餘數量減1,
同時Reader表對應的讀者信息的借書數量也要加1,整個過程應用事務控制。
例如,zhangYongwei借閱了.net書籍。
*/
drop procedure proc_borrow_book
create procedure proc_borrow_book
  @reader varchar(50),
  @book varchar(50)
as
  declare @rid varchar(50)
  declare @bid varchar(50)
  declare @er int = 0 --錯誤累計變量
  
 --通過讀者名獲得讀者的編號
  select @rid = RID
  from Reader
  where RName = @reader
  
  --通過書籍名獲得書籍的編號
  select @bid = BID
  from book
  where bname = @book
  
--以下操作會改變數據庫的狀態,所以開啓事務
begin transaction
  --向borrow表中插入記錄
  insert into Borrow(RID,BID) values(@rid,@bid)
  set @er = @er + @@ERROR
  
  --book表中的剩餘數量減1
  update Book set BCount = BCount - 1
  where BID  = @bid
  set @er = @er +@@ERROR
  
  --reader表中借書的數量加1
  update Reader set LendNum = LendNum +1
  where RID = @rid
 set @er = @er +@@ERROR

 if(@er>0)
 begin --發生錯誤,回滾事務
    print '借書失敗.'
    rollback transaction 
 end
 else
 begin
   print '借書成功.'
   commit transaction  
   print '讀者'+@reader+'借書情況如下:'
   
  --方法一 比較簡便
  /* 
  select bk.BName '書名',br.LendDate '借書日期',br.ReturnDate '歸還日期' 
  from book bk inner join borrow br
  on bk.BID = br.BID
  where br.RID = @rid  */
  
  --方法二,容易理解
  select bk.BName '書名',br.LendDate '借書日期',br.ReturnDate '歸還日期' 
  from book bk inner join borrow br
  on bk.BID = br.BID inner join Reader r
  on br.RID = r.RID
  where r.rname = @reader
end     
go


select * from Reader
select * from book

exec  proc_borrow_book 'zhangYongwei','.net'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章