存儲過程

題目1 一、學校圖書館借書信息管理系統創建三個表: 學生信息表: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 還書日期 請編寫SQL語句完成如下的功能: 1) 查詢「計算機」專業學生在「2007-12-15」至「2008-1-8」時間段內借書的學生編號、學生名稱、圖書編號、圖書名稱、借出日期;參考查詢結果以下圖所示: 2) 查詢全部借過圖書的學生編號、學生名稱、專業;參考查詢結果以下圖所示: 3) 查詢借過做者爲「安意如」的圖書的學生姓名、圖書名稱、借出日期、歸還日期;參考查詢結果以下圖所示: 4) 查詢目前借書但未歸還圖書的學生名稱及未還圖書數量;參考查詢結果以下圖所示: 附加:建表語句: USE master GO /*$$$$$$$$$$$$$建庫$$$$$$$$$$$$$$$$$$$$$$$$*/ --檢驗數據庫是否存在,若是爲真,刪除此數據庫-- IF exists(SELECT * FROM sysdatabases WHERE name='BOOK') DROP DATABASE BOOK GO CREATE DATABASE BOOK GO --建數據表-- USE BOOK GO CREATE TABLE student --學生信息表 ( stuID CHAR(10) primary key, --學生編號 stuName CHAR(10) NOT NULL , --學生名稱 major CHAR(50) NOT NULL --專業 ) GO CREATE TABLE book --圖書表 ( BID CHAR(10) primary key, --圖書編號 title CHAR(50) NOT NULL, --書名 author CHAR(20) NOT NULL, --做者 ) GO CREATE TABLE borrow --借書表 ( borrowID CHAR(10) primary key, --借書編號 stuID CHAR(10) foreign key(stuID) references student(stuID), --學生編號 BID CHAR(10) foreign key(BID) references book(BID),--圖書編號 T_time datetime NOT NULL, --借出日期 B_time datetime --歸還日期 ) GO --學生信息表中插入數據-- 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) 標準答案: -- 1)查詢「計算機」專業學生在「2007-12-15」至「2008-1-8」時間段內借書的學生編號、學生名稱、圖書編號、圖書名稱、借出日期— select 學生編號=stuID,學生名稱=(select stuName from student where stuID=borrow.stuID),圖書編號=BID,圖書名稱=(select title from book where BID=borrow.BID),借出日期=T_time from borrow where stuID in (select stuID from student where major='計算機') and T_time>'2007-12-15' and T_time<'2008-1-8' -- 2)查詢全部借過圖書的學生編號、學生名稱、專業-- select 學生編號=stuID,學生名稱=stuName,專業=major from student where stuID in (select stuID from borrow) -- 3)查詢借過做者爲「安意如」的圖書的學生姓名、圖書名稱、借出日期-- select 學生名稱=(select stuName from student where stuID=borrow.stuID),圖書名稱=(select title from book where BID=borrow.BID),借出日期=T_time,歸還日期=B_time from borrow where BID in (select BID from book where author='安意如') -- 4)查詢目前借書但未歸還圖書的學生名稱及未還圖書數量-- select 學生名稱=(select stuName from student where stuID=borrow.stuID),借書數量=count(*) from borrow where B_time is null group by stuID 題目2 程序員工資表:ProWage 字段名稱 數據類型 說明 ID int 自動編號,主鍵 PName Char(10) 程序員姓名 Wage int 工資 建立一個存儲過程,對程序員的工資進行分析,月薪1500到10000不等,若是有百分之五十的人薪水不到2000元,給全部人加薪,每次加100,再進行分析,直到有一半以上的人大於2000元爲止,存儲過程執行完後,最終加了多少錢? 例如:若是有百分之五十的人薪水不到2000,給全部人加薪,每次加100元,直到有一半以上的人工資大於2000元,調用存儲過程後的結果如圖: 請編寫T-SQL來實現以下功能: 1) 建立存儲過程,查詢是否有一半程序員的工資在2200、3000、3500、4000、5000或6000元之上,若是不到分別每次給每一個程序員加薪100元,至之一半程序員的工資達到2200,3000,3500,4000,5000或6000元。 2) 建立存儲過程,查詢程序員平均工資在4500元,若是不到則每一個程序員每次加200元,至到全部程序員平均工資達到4500元。 建表語句 USE master GO /*$$$$$$$$$$$$$建庫$$$$$$$$$$$$$$$$$$$$$$$$*/ --檢驗數據庫是否存在,若是爲真,刪除此數據庫-- IF exists(SELECT * FROM sysdatabases WHERE name='Wage') DROP DATABASE Wage GO CREATE DATABASE Wage GO --建數據表-- USE Wage GO CREATE TABLE ProWage --程序員工資表 ( ID int identity(1,1) primary key, --工資編號 PName CHAR(10) NOT NULL , --程序員姓名 Wage int NOT NULL --工資 ) GO --插入數據-- 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) 標準答案: --一、建立存儲過程-- if exists (select * from sysobjects where name='Sum_wage') drop procedure Sum_wage GO create procedure Sum_wage @PWage int, @AWage int, @total int as while (1=1) begin if (select count(*) from ProWage)>2*(select count(*) from ProWage where Wage>=@PWage) update ProWage set @total=@total+@AWage,Wage=Wage+@AWage else break end print'一共加薪:'+convert(varchar,@total)+'元' print'加薪後的程序員工資列表:' select * from ProWage --調用存儲過程1-- exec Sum_wage @PWage=2000,@AWage=100,@total=0 exec Sum_wage @PWage=2200,@AWage=100,@total=0 exec Sum_wage @PWage=3000,@AWage=100,@total=0 exec Sum_wage @PWage=4000,@AWage=100,@total=0 exec Sum_wage @PWage=5000,@AWage=100,@total=0 exec Sum_wage @PWage=6000,@AWage=100,@total=0 --二、建立存儲過程2-- if exists (select * from sysobjects where name='Avg_wage') drop procedure Avg_wage GO create procedure Avg_wage @PWage int, @AWage int, @total int as while (1=1) begin if ((select Avg(Wage) from ProWage)<=@PWage) update ProWage set @total=@total+@AWage,Wage=Wage+@AWage else break end print'一共加薪:'+convert(varchar,@total)+'元' print'加薪後的程序員工資列表:' select * from ProWage --調用存儲過程-- exec Avg_wage @PWage=3000,@AWage=200,@total=0 exec Avg_wage @PWage=4500,@AWage=200,@total=0 題目3: 學生成績信息三個表,結構以下: 學生表:Member 字段名稱 數據類型 說明 MID Char(10) 學生號,主鍵 MName Char(50) 姓名 課程表: 字段名稱 數據類型 說明 FID Char(10) 課程,主鍵 FName Char(50) 課程名 成績表:Score 字段名稱 數據類型 說明 SID int 自動編號,主鍵,成績記錄號 FID Char(10) 課程號,外鍵 MID Char(10) 學生號,外鍵 Score int 成績 請編寫T-SQL語句來實現以下功能: 1) 查詢各個學生語文、數學、英語、歷史課程成績,例以下表: 姓名 語文 數學 英語 歷史 張薩 78 67 89 76 王強 89 67 84 96 李三 70 87 92 56 李四 80 78 97 66 2) 查詢四門課中成績低於70分的學生及相對應課程名和成績。 3) 統計各個學生參加考試課程的平均分,且按平均分數由高到底排序。 4) 建立存儲過程,分別查詢參加一、二、三、4門考試及沒有參加考試的學生名單,要求顯示姓名、學號。 建表語句: USE master GO /*$$$$$$$$$$$$$建庫$$$$$$$$$$$$$$$$$$$$$$$$*/ --檢驗數據庫是否存在,若是爲真,刪除此數據庫-- IF exists(SELECT * FROM sysdatabases WHERE name='Student') DROP DATABASE Student GO CREATE DATABASE Student GO --建數據表-- USE Student GO CREATE TABLE Member --學生表 ( MID char(10) primary key, --學生號 MName CHAR(50) NOT NULL --姓名 ) GO CREATE TABLE F --課程表 ( FID char(10) primary key, --課程號 FName CHAR(50) NOT NULL --課程名 ) GO CREATE TABLE score --學生成績表 ( SID int identity(1,1) primary key, --成績記錄號 FID char(10) foreign key(FID) references F(FID) , --課程號 MID char(10) foreign key(MID) references Member(MID) , --學生號 Score int NOT NULL --成績 ) GO --課程表中插入數據-- 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) 標準答案: -- 1)查詢各個學生語文、數學、英語、歷史課程成績-- SELECT Member.MName AS 姓名, 英語 = SUM(CASE F.FName WHEN '語文' THEN Score.Score END), 數學 = SUM(CASE F.FName WHEN '數學' THEN Score.Score END), 語文 = SUM(CASE F.FName WHEN '英語' THEN Score.Score END), 歷史 = SUM(CASE F.FName WHEN '歷史' THEN Score.Score END) FROM Score, Member,F WHERE F.FID = Score.FID AND Member.MID =Score.MID GROUP BY Member.MName -- 2)查詢四門課中成績低於70分的學生及相對應課程名和成績-- select 姓名=(select MName from Member where MID=Score.MID),課程名=(select FName from F where FID=Score.FID),成績=Score from Score where Score<70 -- 3)統計各個學生四課程的平均分,且按平均分數由高到底排序-- select 姓名=(select MName from Member where MID=Score.MID),平均分=Avg(Score) from Score group by MID order by 平均分 desc -- 4)建立存儲過程-- if exists (select * from sysobjects where name='P_stu') drop procedure P_stu GO create procedure P_stu @num int As print'參加'+convert(varchar(5),@num)+'門課考試的學生姓名及學號:' select 姓名=(select MName from Member where MID=Score.MID),學號=MID from Score group by MID having count(*)=@num --調用存儲過程-- exec P_stu @num=2