sql server存储过程练习

本文通过案例展示了SQL数据库的基本操作,如创建表、插入数据,以及存储过程的创建和使用。存储过程包括查询学生信息、课程信息、选课情况等,还涉及了数据的修改。此外,讨论了在实际生产中存储过程的使用限制和潜在问题。
摘要由CSDN通过智能技术生成


提示:以下是本篇文章正文内容,下面案例可供参考

案例一.

	CREATE DATABASE sc
		-- 设置工作数据库
	use sc
	-- 创建表
	CREATE TABLE Student(
		SNo CHAR(9) PRIMARY Key,
		SName CHAR(20) UNIQUE,
		SDept CHAR(20),
		SB datetime,
		SSex CHAR(2),
		);
	
INSERT INTO student VALUES('s01','王玲','计算机','2001-03-01','男')
INSERT INTO student VALUES('s02','李想','计算机','2002-04-01','女')
INSERT INTO student VALUES('s03','罗军','数学','2000-03-01','男')
INSERT INTO student VALUES('s04','李爱民','英语','2003-06-01','女')
INSERT INTO student VALUES('s05','季然','英语','2001-02-01','女')
INSERT INTO student VALUES('s06','王明','数学','2002-06-01','男')
	
	use sc
	-- 创建表
	CREATE TABLE Course(
		CNo CHAR(4) PRIMARY Key,
		CName CHAR(40) NOT null,
		CPno CHAR(4),
		FOREIGN KEY(CPno)REFERENCES Course(CNo)
			--表级完整性约束条件,CPno是外码,被参照表是Course,被参照列是CNo
		);
	
	INSERT INTO course VALUES('c01','高等数学',null)
	INSERT INTO course VALUES('c02','数据结构',null)
	INSERT INTO course VALUES('c03','操作系统','c02')
	INSERT INTO course VALUES('c04','数据库','c03')
	INSERT INTO course VALUES('c05','作战指挥','c04')
	INSERT INTO course VALUES('c06','离散数学','c01')
	INSERT INTO course VALUES('c07','信息安全','c06')
	INSERT INTO course VALUES('c08','大学英语',null)
	INSERT INTO course VALUES('c09','商贸英语','c08')
	INSERT INTO course VALUES('c10','大学物理',null)
	INSERT INTO course VALUES('c11','网络',null)
	INSERT INTO course VALUES('c12','C程序',null)
	
	SELECT * FROM Course;
	use sc
	-- 创建表
	CREATE TABLE SC(
		SNo CHAR(9),
		CNo CHAR(4),
		Grade SMALLINT,
		PRIMARY KEY(SNo, CNo),
		FOREIGN KEY(Sno)REFERENCES Student(Sno),
		FOREIGN KEY(Cno)REFERENCES Course(CNo)
		);
	
	
	INSERT INTO sc VALUES('s01','c01',80.0)
	INSERT INTO sc VALUES('s01','c02',98.0)
	INSERT INTO sc VALUES('s01','c03',85.0)
	INSERT INTO sc VALUES('s01','c04',80.0)
	INSERT INTO sc VALUES('s02','c07',89.0)
	INSERT INTO sc VALUES('s02','c05',88.0)
	INSERT INTO sc VALUES('s02','c06',78.0)
	INSERT INTO sc VALUES('s03','c04',89.0)
	INSERT INTO sc VALUES('s03','c01',88.0)
	INSERT INTO sc VALUES('s03','c03',78.0)
	INSERT INTO sc VALUES('s04','c07',77.0)
	INSERT INTO sc VALUES('s04','c02',null)
	INSERT INTO sc VALUES('s04','c09',83.0)
	INSERT INTO sc VALUES('s05','c10',75.0)
	INSERT INTO sc VALUES('s05','c11',90.0)
	INSERT INTO sc VALUES('s05','c03',94.0)
	INSERT INTO sc VALUES('s06','c09',89.0)
	INSERT INTO sc VALUES('s06','c10',88.0)
	INSERT INTO sc VALUES('s06','c11',null)
	
	SELECT * FROM SC;
	
-- 1.创建存储过程s_info,根据学生的姓名和学号查询学生的年龄、所在系。
select * from Student
drop procedure s_info;
go
CREATE PROCEDURE s_info(
	@name varchar(20),
	@num char(5)
)
	AS 
	print '----------------'
	print '学生的年龄和所在系分别为'
	SELECT Sno,Sname,(YEAR(GETDATE())-YEAR(SB)) age,SDept FROM Student WHERE SNo=@num and SName=@name;
go
 
EXEC s_info '王玲','s01';
-- 2.创建存储过程s_default,根据学生的姓名和学号查询学生的年龄、所在系。如果未提供学生的姓名和学号,该存储过程将显示学号为‘s01’,姓名为“王玲”的学生信息。
drop procedure s_default;
go
CREATE PROCEDURE s_default(
	@name varchar(20)=NULL,
	@num char(5)=NULL
)
	AS 
	print '----------------'
	print '学生的年龄和所在系分别为'
	IF (@name != NULL AND @num != NULL)
	SELECT Sno,Sname,(YEAR(GETDATE())-YEAR(SB)) age,SDept FROM Student WHERE SNo=@num and SName=@name;
	ELSE SELECT * FROM Student WHERE SNo='s01'; 
go
 
EXEC s_default;
-- 3.创建存储过程s_nul,根据学生的姓名和学号查询学生选修的课程。如果未提供生的姓名和学号,则显示提示信息“请输入学号和姓名!”。
drop procedure s_nul;
go
CREATE PROCEDURE s_nul(
	@num char(5)=NULL,
	@name varchar(20)=NULL
	
)
	AS 
	IF (@name IS  NULL AND @num IS  NULL)
	print '请输入学号和姓名!'
	ELSE 
	BEGIN
	SELECT SName,CName
	FROM (SELECT SNo,SName FROM Student WHERE SNo=@num and SName=@name) A,
	(SELECT B.SNo,B.CNO,CName FROM SC B
		right JOIN 
	(SELECT CName,CNo FROM Course) C ON C.CNo=B.CNO) D
	where A.SNo=D.SNo;
	END; 
go
 
EXEC s_nul 's01','王玲';
-- 4.创建存储过程s_count,根据课程名,检索选修某门课程的学生人数。
drop procedure s_count;
select * from Student;
select * from sc;
select * from Course;
go
CREATE PROCEDURE s_count(
	@cname varchar(20)=NULL
)
	AS 
	SELECT SUM() 学生人数,cno FROM Course where cname=@cname,
	sc where course.
	group by CName 
go
 
EXEC s_count '高等数学';
-- 5.创建存储过程sg,根据输入的学号和课程号,获得指定学号和课程号的课程成绩。
drop procedure sg;
select * from Student;
select * from sc;
select * from Course;
go
CREATE PROCEDURE sg(
	@sno char(10)=null
	@cno char(10)=NULL
)
	AS 
	SELECT COUNT(*),SDept FROM Student 
go
 
EXEC sg 's01','c01';

-- 6.创建存储过程update_s_1,修改指定学号的数据信息。

基本表数据

在这里插入图片描述
– 1.创建存储过程s_info,根据学生的姓名和学号查询学生的年龄、所在系。

go
CREATE PROCEDURE s_info(
	@name varchar(20),
	@num char(5)
)
	AS 
	print '----------------'
	print '学生的年龄和所在系分别为'
	SELECT Sno,Sname,(YEAR(GETDATE())-YEAR(SB)) age,SDept FROM Student WHERE SNo=@num and SName=@name;
go
 
EXEC s_info '王玲','s01';

在这里插入图片描述
– 2.创建存储过程s_default,根据学生的姓名和学号查询学生的年龄、所在系。如果未提供学生的姓名和学号,该存储过程将显示学号为‘s01’,姓名为“王玲”的学生信息。

go
CREATE PROCEDURE s_default(
	@name varchar(20)=NULL,
	@num char(5)=NULL
)
	AS 
	print '----------------'
	print '学生的年龄和所在系分别为'
	IF (@name != NULL AND @num != NULL)
	SELECT Sno,Sname,(YEAR(GETDATE())-YEAR(SB)) age,SDept FROM Student WHERE SNo=@num and SName=@name;
	ELSE SELECT * FROM Student WHERE SNo='s01'; 
go
 
EXEC s_default;

在这里插入图片描述
– 3.创建存储过程s_nul,根据学生的姓名和学号查询学生选修的课程。如果未提供生的姓名和学号,则显示提示信息“请输入学号和姓名!”。

go
CREATE PROCEDURE s_nul(
	@num char(5)=NULL,
	@name varchar(20)=NULL
	
)
	AS 
	IF (@name IS  NULL AND @num IS  NULL)
	print '请输入学号和姓名!'
	ELSE 
	BEGIN
	SELECT SName,CName
	FROM (SELECT SNo,SName FROM Student WHERE SNo=@num and SName=@name) A,
	(SELECT B.SNo,B.CNO,CName FROM SC B
		right JOIN 
	(SELECT CName,CNo FROM Course) C ON C.CNo=B.CNO) D
	where A.SNo=D.SNo;
	END; 
go
 
EXEC s_nul 's01','王玲';

在这里插入图片描述

– 4.创建存储过程s_count,根据课程名,检索选修某门课程的学生人数。

go
CREATE PROCEDURE s_count(
	@cname varchar(20)=NULL
)
	AS 
	SELECT count(sc.SNo) 学生人数,sc.cno FROM (select CNo,Cname from Course where cname=@cname) A
	left join sc on A.CNo=sc.CNo 
	group by sc.cno;
go
EXEC s_count '高等数学';

在这里插入图片描述
– 5.创建存储过程sg,根据输入的学号和课程号,获得指定学号和课程号的课程成绩。

go
CREATE PROCEDURE sg(
	@sno char(10)=null,
	@cno char(10)=NULL
)
	AS 
	SELECT @sno 学号,@cno 课程号,grade FROM sc where sno=@sno and cno=@cno;
go
 
EXEC sg 's01','c01';

在这里插入图片描述
– 6.创建存储过程update_s_1,修改指定学号的数据信息。

go
CREATE PROCEDURE update_s_1(
	@sno char(10)=null,
	@SDept char(10)=null
)
	AS 
	print '修改前的数据:'
	SELECT * FROM student where sno=@sno;
	print '------------'
	print '修改后的数据'
	update student set SDept=@SDept where  sno=@sno;
	SELECT * FROM student where sno=@sno;
go
 
EXEC update_s_1 's01','SDept';

在这里插入图片描述

案例二

create table book
(
图书编号 int  not null,
图书名 char(16),
图书类型 varchar(8),
图书价格 char(16),
图书数量 int
primary key(图书编号)
);
insert into bill values
(02,'lisi',01,2,'2020-12-19',20);
insert into bill values
(03,'zhangsan',02,1,'2020-12-18',12);
insert into bill values
(04,'huahua',04,3,'2020-12-16',45);
insert into bill values
(05,'lisi',03,2,'2020-12-17',26);
insert into bill values
(06,'huahua',01,1,'2020-12-16',10);

create table warehouse
(
仓库编号 int  not null,
图书名 char(16),
储存数量 int,
primary key(仓库编号),
foreign key(仓库编号) references book(图书编号)
);
insert into warehouse values
(01,'西游记',60);
insert into warehouse values
(02,'水浒传',60);
insert into warehouse values
(03,'红楼梦',60);
insert into warehouse values
(04,'三国演义',60);
insert into warehouse values
(05,'数据库系统概论',60);

在这里插入图片描述

创建存储过程查询某段时间内各种图书的进货和销售情况



drop PROC bookmarket;

CREATE PROC bookmarket
@date1 char(16),
@date2 char(16)
AS
select  购买图书编号 as '图书编号',数量 as '总进货(本)' ,购买数量 as '总销售(本)' from 
(select sum(数量) 数量,仓库编号 from inwarehouse
where 日期 between @date1 and @date2 group by 仓库编号) A
inner join
(select 购买图书编号,sum(购买数量) 购买数量 from bill
where 购买日期 between @date1 and @date2 
GROUP by 购买图书编号) B on B.购买图书编号=A.仓库编号

EXEC bookmarket '2020-12-15','2021-12-30'

在这里插入图片描述

总结

通过本次的练习。了解到,实际生产中大部分是禁止使用存储过程的。只有dba才有创建和使用的权限。因为数据库本质是存数据的,其余操作都不应该在数据库实现。同时存储过程难以移植。存储过程没有版本控制,版本迭代的时候要更新很麻烦。存储过程如果和外部程序结合起来用,更新的时候很难无感升级,可能需要停服。存储过程不利于将来分库分表。存储过程的功能不一定够强大,业务扩展之后可能会发现无法继续用存储过程实现了。存储过程可能无法和许多中间件、ORM库一起使用。更换数据库也会造成麻烦。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最难不过坚持丶渊洁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值