原本觉得掌握最基本的语法就行了,但发现老师最近又提到了存储过程,我觉得有必要学习整理一下,以下是我的简单笔记
create procedure 存储过程名(参数列表)
begin
存储过程体(一般合法的SQL语句)
end
参数列表包含三个部分(参数模式,参数名称,参数类型)
参数列表举例:IN stuname varchar(20)
参数模式:
注意:
如果存储过程只有一句话,BEGIN END可以省略
存储过程体中的每条SQL语句的结尾要求必须加分号
存储过程体的结尾可以使用DELIMITER重新设置
语法:DELIMITER 结束标记
案例:DELIMITER $
CALL 存储过程名(实参列表);
例:向student表中插入4条数据 。
先创建一个student表
create table student(
id int auto_increment,//学号
name varchar(20),//名字
score double,//分数
primary key(id)
);
创建相应的存储过程
delimiter $
create procedure myp1()
begin
insert into student(name,score)
values ('jack',89),('sam',93),('bobi',100),('alen',85);
end $
创建好后我们需要调用这个存储过程就能实现插入操作
call myp1();
例1:通过学生id,查找对应分数(我这里就简单的单表查询进行演示一下)
delimiter $
create procedure myp02(IN id int)
begin
select s.score
from student s
where s.id=id;
end $
调用该存储过程
call myp02(1);
这里传入的id为1,即返回jack的分数
例2.案例1:输入id和学生名,判断该学生是否存在
delimiter $
create procedure myp004(IN id int,IN name varchar(20))
begin
declare result int default 0;#声明变量和默认值
select count(*) into result#赋值
from student s
where s.id = id
and s.name = name;
select if(result>0,'存在学生','不存在学生') '存在与否' ;
end $
调用过程
call myp004(1,'哈哈');
准备:先创建一个课程表
create table class(
id int primary key auto_increment,
cname varchar(20)
);
delimiter $
create procedure myp5(IN sid int,out cname varchar(20))
begin
select c.cname into cname
from class c
inner join student s on s.id = c.id
where s.id = sid;
end $
调用过程
call myp5(1,@Name);//这里其实就是将更具id查到的课程名赋值给变量@Name
select @Name;//我们再查询这个变量就可以得到这个课程名
例:传入a和b两个值,最终a和b都翻倍并返回
delimiter $
create procedure myp6(inout a int, inout b int)
begin
set a=a*2;
set b=b*2;
end
$
调用过程
set @a=2;//设置变量@a=2
set @b=4;//设置变量@b=4
call myp6(@a,@b);//将两个变量作为参数传入该存储过程
select @a,@b;//然后我们再查看变量@a和@b的值
语法:drop procedure 存储过程名;
注:一次只能删除一个
语法:show create procedure 存储过程名;
例:show create procedure myp1;
示例如下:
此处只是列举了最基础的例子,很多情况可能没有涉及到,希望各位大佬能够提出自己的见解,共同学习,共同进步!