- 使用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語句完成以下的功能:
- 顯示出“計算機”專業學生在“2007-12-15”至“2008-1-8”時間段內借書的學生編號、學生名稱、圖書編號、圖書名稱、借出日期;參考查詢結果如下圖所示:
- 查詢所有借過圖書的學生編號、學生名稱、專業;參考查詢結果如下圖所示:
- 定義存儲過程,實現查詢任意作者的圖書補借閱的情況,例如借過作者爲“安意如”的圖書的學生姓名、圖書名稱、借出日期、歸還日期;參考查詢結果如下圖所示:
- 查詢目前借書但未歸還圖書的學生名稱及未還圖書數量;參考查詢結果如下圖所示:
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
- 使用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來實現如下功能:
- 創建一個存儲過程,對程序員的工資進行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,給所有人加薪,每次加100,再進行分析,直到有一半以上的人大於2000元爲止,存儲過程執行完後,最終加了多少錢?
例如:如果有百分之五十的人薪水不到2000,給所有人加薪,每次加100元,直到有一半以上的人工資大於2000元,調用存儲過程後的結果如圖:
- 創建存儲過程,查詢程序員平均工資是否低於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
- 使用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語句來實現如下功能:
- 查詢四門課中成績低於70分的學生及相對應課程名和成績。
- 統計各個學生參加考試課程的平均分,且按平均分數由高到底排序。
- 創建存儲過程,分別查詢參加了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
- 使用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語句完成以下的功能:
- 使用case-end結構顯示書籍的價格等級參考查詢,結果如下圖所示:
- 定義存儲過程,查詢顯示圖書表的所有圖書總額,每本書的總金額=單價*數量,並統計所有圖書的現存數量,如果現存數量不足10000本,則提示’現有圖書不足一萬本,還需要繼續購置書籍’,否則,提示’現有圖書在一萬本以上,需要管理員加強圖書管理’;參考查詢結果如下圖所示:
- 定義存儲過程,輸入讀者名和書名完成借書過程,先要向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'