SQL存储过程实例具体解释

本文用3个题目,从建立数据库到创建存储过程,具体解说数据库的功能。

题目1

学校图书馆借书信息管理系统建立三个表:
学生信息表:student

字段名称

数据类型

说明

stuID

char(10)

学生编号,主键

stuName

Varchar(10)

学生名称

major

Varchar(50)

专业

图书表:book

字段名称

数据类型

说明

stuID

char(10)

学生编号,主键

stuName

Varchar(10)

学生名称

major

Varchar(50)

专业

借书信息表: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)

标准答案:

--1、创建存储过程--
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、创建存储过程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)

姓名

课程表:F

字段名称

数据类型

说明

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)创建存储过程,分别查询參加1、2、3、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

转载于:https://www.cnblogs.com/jzdwajue/p/6873295.html

SQL存储过程实例具体解释相关推荐

  1. java sql函数_Java调用Sql存储过程实例讲解

    1.使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转 义序列.不带参数的 call 转义序列的语法如下所示: {call procedure-n ...

  2. 9.SQL存储过程实例详解

    本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能. 题目1 学校图书馆借书信息管理系统建立三个表: 学生信息表:student 字段名称 数据类型 说明 stuID char(10) ...

  3. 详细实例全面解析SQL存储过程

    存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,类似一门程序设计语言,也包括了数据类型.流程控制.输入和输出和它自己的函数库.存储过程可以说是一个记录集,它是由一些 ...

  4. SQL 存储过程 procedure 讲解+代码实例

    文章目录 1. 存储过程概述 2. 创建存储过程 create procedure 2.1. 参数 in.out.inout 3. 调用存储过程 call 4. 查看存储过程 4.1. 查看存储过程的 ...

  5. sql 存储过程 并发测试_SQL单元测试模拟存储过程

    sql 存储过程 并发测试 In this SQL Unit testing article, we will continue our journey with SQL unit testing. ...

  6. sql存储过程完全教程

    sql存储过程完全教程 目录 1.sql存储过程概述 2.SQL存储过程创建E2C~,x0@iC|4W7c*H 3.sql存储过程及应用)z,e1A{3o 4.各种存储过程使用指南A~k?/L cS` ...

  7. Oracle PL/SQL 存储过程

    Oracle PL/SQL 存储过程 Oracle 简介: 是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库系统是目前世界上流行的关系数据库管理系 ...

  8. SQL SERVER DBCC命令解释

    SQL SERVER DBCC命令解释 八点钟起床一直搞到现在,好多还不太记得,先放上来以后慢慢修改 2007-05-01 12:56:28 --------------------- --1 dbc ...

  9. SQL触发器实例讲解1

    SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.        常见的触发器有三种:分别应 ...

最新文章

  1. jquery拖拽实现UI设计组件
  2. python中的继承有什么特点_python类的继承是什么?类的继承有什么样的规则?
  3. VS2010 自定义用户控件未出现在工具箱的解决方案
  4. joomla3.6.5 nginx下 前台页面404错误
  5. 【Python】KNN简单的判别预测
  6. 【安全漏洞】ProxyShell漏洞复现详解
  7. JAVA接口里面的变量
  8. 程序.NET Framework版本升级,重签名,重链接,批量签名工具
  9. Oracle count函数原理,oracle count函数
  10. 本地mysql数据库初始密码_忘记本地MySQL数据库密码的解决方法
  11. SqlDataReader.GetFloat出错,类型无法转换
  12. C++小游戏——推箱子
  13. kali 安装 google 浏览器
  14. 【转】腾讯云PCDN:从P2P到万物互联服务框架
  15. CentOS8 dnf软件包管理配置
  16. 如何使用中国知网查询文献,并自动生成参考文献格式引文?
  17. Win11输入法不见了怎么办
  18. 蓝牙鼠标链接Win10需要“输入MI MOUSE BT3.0的PIN”的解决方案
  19. vue-cli之加载ico文件
  20. C语言--if…if…和if…else if的区别

热门文章

  1. Linux搭建Node.js环境
  2. Microsoft Fluent Design System
  3. (转)Git详解之三:Git分支
  4. libudev-dev 错误 libudev1 (= 204-5ubuntu20) 但是 204-5ubuntu20.5 正要被安装 解决方法
  5. 使用adb install 时 提示error: more than one device and emulator
  6. 2.5.2 MySQL二进制日志介绍
  7. 10.14 ssh:安全地远程登录主机
  8. 11.15 dmidecode:查询系统硬件信息
  9. java ssm框架详解_Java的SSM框架怎样才算真正掌握?
  10. 重磅|阿里云发布“一站式敏捷数据仓库解决方案” 实现库仓一体数据分析能力(内含干货PPT下载)