MySQL存储过程及语法详解
函数:是一个有返回值的过程;过程:是一个没有返回值的函数
存储过程和自定义函数的区别:
存储过程实现的功能要复杂一些;而函数的针对性更强。 存储过程可以返回多个值;函数只能有一个返回值。 存储过程一般独立的来执行;而函数可以作为其他SQL语句的组成部分实现出来。 1.2 创建存储过程 1.2.1 语法格式 # 这个地方其实是用来声明SQL语句的结束符号的delimiter //
# 这个地方此时真正的用来创建一个存储过程的
create procedure 存储过程名称(参数列表)
begin
sql语句
end//
# 当创建完一个存储过程之后再将分隔符替换为分号,为了不影响其他的操作
delimiter ; 2.2.2 语法介绍 delimiter : 用于设置sql语句分割符,默认为分号。因为在MySQL中每一条SQL语句都必须以 ;进行结束,当我们换行的时候就会执行这条SQL语句,但是我们此时的存储过程并没有结束,就会造成直接执行没有写完的存储过程造成报错,所以此时需要声明其他的结束符,不让其使用默认的分隔符结束SQL语句。 sql语句 :在这个部分编写sql语句,编写的语句需要以分号结尾,此时回车会直接执行,所以要创建存储过程前需要指定其他符号作为分割符,此时使用 // , 也可以使用其它字符。 // : 声明结束符号,这个符号可以是任意的,是自定义的。相当于就是把 分号替换为 //
创建存储过程查询学生信息
# 将SQL语句的结束符号分隔符替换为//delimiter //
create procedure proc_stu()
begin
select * from students; # 此时这个分号并不会结束这个语句,存储过程中的SQL语句还是用分隔符进行分隔
end // # 这里使用这个结束符号代表这个存储过程创建完成
delimiter; # 创建完一个存储过程之后将结束符号替换为分号,防止进行其他操作的时候有问题 1.3 调用存储过程
语法格式:
call proc_stu(); # 调用的时候需要加上括号,因为可能存在参数 1.4 查看存储过程语法格式:
# 查询 studnet 数据库中的所有的存储过程select name from mysql.proc where db= studnet
# 查询存储过程的状态信息
show procedure status; 1.5 删除存储过程
语法格式:
drop procedure proc_stu; # 删除的时候不要加小括号,直接给定存储过程的名字即可。drop procedure if exists proc_stu; # 如果存储删除,不存在不删除并且不会报错 2. 存储过程中的语法结构 存储过程是可以编程的,意味着可以使用变量、表达式、控制语句来完成比较复杂的功能。 2.1 变量的声明以及赋值 2.1.1 DECLARE 声明变量
DECLARE : 通过 DECLARE 关键字可以定义一个局部变量,该变量的作用范围只能在 BEGIN..,END 块中。
语法格式:
DECLARE 变量名[, ] type [DEFAULT value]注意:声明变量的时候可以一次性声明多个,使用逗号隔开。
示例:
delimiter $create procedure proc_stu()
begin
declare num int default 5;
select num + 10; # 输出结果为15
end $
delimiter ; 2.1.2 SET 变量赋值
SET : 直接赋值使用SET关键字,可以赋常量或者是表达式,具体语法如下:
SET 变量名 = 变量值 [,变量名 = 变量值]注意:一次可以给多个变量赋值,中间使用逗号隔开。
delimiter $create procedure proc_stu()
begin
declare name varchar(20); # 可以指定变量类型以及变量的范围
set name = MySQL # 给变量直接赋值
select name; # 输出结果为:MySQL
end $
delimiter ; 2.1.3 select into 赋值 delimiter $
create procedure proc_student()
begin
declare count_num int(10);
select count(*) into count_num from student;
select count_num;
end $
delimiter ; 2.2 条件判断 2.2.1 if条件判断
语法结构:
# 只有满足差选条件才会执行 then 后面的SQL语句if search_condition(查询条件) then statement_list(SQL语句)
[else if search_condition(查询条件) then statement_list(SQL语句)]
[else statement_list(SQL语句)]
end if;
需求:
根据身高,判断当前身高所属的身材类型
180及以上 身材高挑
170 180 标准身材
170以下 - 一般身材
实现这个简单的逻辑:
delimiter $create procedure pro_figure()
begin
# 定义一个身高的变量
declare height int(11) default 175;
# 定义一个存储身高类型的变量
declare figure varchar(50) default
# 使用 if 语句判断身材类型
if height = 180 then
set figure = 身材高挑
else if height 180 and height = 170 then
set figure = 标准身材
else set figure = 一般身材
end if;
# 输出结果
select concat(height + 身高的身材为: + figure);
end $
delimiter ; 2.3 传递参数
语法格式:
delimiter $
# 我们可以不指定 [in/out/inout] , 默认为 in,输入参数
create procedure pro_name([in/out/inout]参数名 参数类型)
begin
sql语句
end $
delimiter ;
# in : 该参数可以作为输入,调用该存储过程需要传入的值,默认
# out : 该参数作为输出,调用该存储过程之后返回的值。
# inout : 既可以作为输入参数也可以作为输出参数。
需求:根据输入的身高变量的值,判断当前身高对应的身材类型
实现:
delimiter $# 此时调用者在调用这个存储过程的时候必须传递身高的变量值
create procedure pro_name(in height int(11))
begin
# 定义一个存储身高类型的变量
declare figure varchar(50) default
# 使用 if 语句判断身材类型
if height = 180 then
set figure = 身材高挑
else if height 180 and height = 170 then
set figure = 标准身材
else set figure = 一般身材
end if;
# 输出结果
select concat(height + 身高的身材为: + figure);
end $
delimiter ;
调用:
# 调用该存储过程。需要传递其中的身高值call pro_name(175); # 输出结果为: 2.3.2 out 输出参数
需求:根据输入的身高,返回当前身高所处的身材类型
实现:
delimiter $create procedure pro_output(in height int(11) , out figure varchar(100))
begin
# 使用 if 语句判断身材类型
if height = 180 then
set figure = 身材高挑
else if height 180 and height = 170 then
set figure = 标准身材
else set figure = 一般身材
end if;
end $
delimiter ;
调用:
# @标识符:在MySQL中代表的就是用户定义的一个变量,这里我们使用这个变量来接收这个存储过程的返回值call pro_output(175 , @figure);
# 查看存储过程返回的结果
select @figure;
@标识符的作用
@figure :这种在变量名前面加上 @ 符号,叫做用户会话变量,代表整个会话过程他都是有作用的,这个类似于全局变量一样。当前会话就是代表的,比如我们在命令提示窗口中给好多带有 @ 符号变量进行赋值,此时这些变量的值只作用于当前的会话,当我们把这个窗口关闭的时候,此时这些变量的值就会释放掉。 @@global : 这种在变量名前加上 @@ 符号,叫做系统变量。 2.4 case 结构语法格式:
# 方式一case case_value(判断的值)
when when_value(比较的值) then statement_list(SQL语句)
[when when_value(比较的值) then statement_list(SQL语句)]
[else statement_list(SQL语句)]
end case;
# 方式二
case
when search_condition(查询条件) then statement_list(SQL语句)
[when search_condition(查询条件) then statement_list(SQL语句)]
[else statement_list(SQL语句)]
end case;
需求:给定一个月份,判断该月份所属的季度
实现:
delimiter $create procedure pro_quarter(in mon int(11))
begin
# 定义存储季度的变量
declare result varchar(10);
case
when mon = 1 and mon = 3 then
set result = 第一季度
when mon = 4 and mon = 6 then
set result = 第一季度
when mon = 7 and mon = 9 then
set result = 第一季度
else
set result = 第四季度
end case;
# 输出结果
select result;
end $
delimiter ; 2.5 while循环
有条件的循环控制语句,当满足条件的时候进入循环,不满足条件的时候退出循环。
语法结构:
# 只要查询条件一直成立就会一直指定do后面的SQL语句,当查询条件不成立的时候直接跳出while循环while search_condition(查询条件) do
statement_list(SQL语句)
end while;
需求:计算从1加到n的值
实现:
delimiter $create procedure pro_sum(in num int(11))
begin
# 定义存储总数的变量
declare total int(255) default 0;
# 定义存储循环次数的数量
declare number int(255) default 1;
while number = num do
set total = total + number;
set number = number + 1;
end while;
select total;
end $
delimiter ; 2.6 repeat循环
有条件的循环控制语句,当不满足条件的时候进入循环,满足条件的时候跳出循环。他和while循环是反着的
语法结构:
repeatstatement_list(SQL语句)
until search_condition(查询添加)
end repeat;
需求:计算从1加到n的值
实现:
delimiter $create procedure pro_sum(in num int(11))
begin
# 定义存储总数的变量
declare total int(255) default 0;
repeat
set total = total + number;
set num = num 1;
# 注意:这个 unti 后的查询条件不要加分号,加分号会报错。
until num = 0
end repeat;
select total;
end $
delimiter ; 2.7 loop循环
loop实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用leave语句实现,具体语法如下:
语法格式:
[begin_label:] loopstatement_list
end loop [end_label]
如果不在statement_list中增加退出循环的语句,那么loop语句可以永安里实现简单的死循环。
2.8 leave语句用来从标注的流程构造中退出,通常和 begin end 或循环一起使用。下面是一个使用loop和leave的简单例子,退出循环:
需求:计算从1加到n的值 使用loop leave的形式进行退出循环
实现:
delimiter $create procedure pro_sum(in num int(11))
begin
# 定义存储总数的变量
declare total int(255) default 0;
c(该循环的别名):loop
set total = total + num;
set num = num 1;
# 借助leave组织退出条件
if num = 0 then
leave c;
end if;
end loop c;
select total;
end $
delimiter ;
到此这篇关于MySQL存储过程及语法详解的文章就介绍到这了,更多相关MySQL存储语法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 MySQL存储过程及语法详解
相关文章
- 支持MySQL海量数据存储的创新技术(mysql海量存储)
- MySQL命令驱动数据库管理(mysql命令数据库)
- MySQL查询存储过程:获取最佳数据结果(mysql查询存储过程)
- MySQL赋值:实现数据库功能的关键技巧(mysql赋值)
- 失败MySQL存储过程执行失败:一次挫折经历(mysql存储过程执行)
- 站MySQL官方网站:了解最新技术发展(mysql官方网)
- 事务MySQL跨库事务:实现资源共享(mysql跨库)
- 简易教程:MySQL修改配置文件(mysql修改配置文件)
- MySQL中的二进制数据存储策略(mysql二进制数据)
- 似数据结构MySQL数据结构:有效的存储与组织方式(mysql帮助类)
- MySQL查询语句快速入门:25个关键字(mysql查询语句怎么写)
- MySQL文件管理之操作篇(mysql文件操作)
- 如何解决MySQL的乱码问题?(mysql的乱码问题)
- MySQL的游标使用详解(mysql中使用游标)
- MySQL中1005错误的解决方法(mysql中1005)
- CMD终止MySQL进程的办法(cmd杀死mysql进程)
- 数据库MySQL数据库二进制文件创建存储与管理(2ef mysql)
- 掌握MySQL中分钟表示,轻松管理数据存储与查询(mysql中分钟表示)
- 详解MySQL的三级城市表设计方法(mysql 三级城市表)
- MySQL如何实现一行表多行数据存储(mysql一行表多行)
- MySQL与一致性哈希优化数据传输效率(mysql 一致性哈希)
- MySQL灵活字段设计,提升数据存储效率(mysql不定字段设计)
- MySQL下载后的安装步骤详解(mysql下载完如何安装)
- MySQL数据库遭遇两个冲突问题,如何解决(mysql下了两个冲突)
- 利用MySQL实现高效上传语句的方法探讨(mysql上传语句)
- MySQL实现上传和管理图片文件(mysql上传图片个文件)
- MySQL 三表连接查询实现多表关联操作(mysql 三表连接查询)
- MySQL未开启监听模式导致连接失败(mysql不监听)