存储过程
存储过程
【1】简介#
- 存储过程是一种在数据库中保存的sql语句集合,它可以执行一系列的数据库操作。
- 使用存储过程有以下几点好处
- 性能提升:存储过程在服务器端执行,减少了网络通信量和延迟。
- 代码重用和标准化:存储过程可以被多次调用,有助于代码重用和保持一致性。
- 安全性:可以限制对特定数据的直接访问,而是通过存储过程提供控制的接口。
- 维护:修改存储过程比更改多个应用程序中的SQL语句要容易
【2】创建和调用存储过程#
- 在MySQL中,你可以使用
CREATE PROCEDURE
语句来创建一个存储过程。这里是一个基本示例:
-- 创建存储过程
delimiter $$
create procedure p1()
begin
select * from dep;
end$$
delimiter ;
-- 调用存储过程
call p1;
delimiter $$
create procedure p1()
begin
select name,
if(gender='male','小哥哥','小姐姐') from emp;
end$$
delimiter ;
【3】参数#
- 在mysql中,存储过程可以接收三种类型的参数
- 输入参数(in):这就像是你给这个小程序的原材料。你告诉它需要用到什么,它就会用这些材料来完成任务。比如,你可以告诉它需要查询哪个用户的信息。
- 输出参数(OUT):这就像是小程序做好的菜肴。完成任务后,它会把结果给你。比如,小程序可以告诉你某个用户的年龄。
- 输入输出参数(INOUT):这就像是你给小程序一个半成品,让它加工后再还给你。你给它一些信息,它处理这些信息,然后把处理后的信息返回给你。比如,你给它一个数字,它把这个数字加倍后还给你。
-- 语法
create procedure <存储过程名称>([in/out/inout <参数名><参数类型>])
begin
sql语句
end;
-- 例子
drop procedure if exists p1;
delimiter $$
create procedure p1(in age int,out res varchar(15))
begin
set res=case
when age < 20 then '小奶狗'
when age between 20 and 30 then '小年轻'
when age between 30 and 40 then '小叔叔'
else '老前辈'
end;
end$$
delimiter ;
变量补充
- 在MySQL中,有三种主要类型的变量:系统变量、用户定义变量(自定义变量)和局部变量。
【1】系统变量#
-
系统变量是mysql服务器提供的,用于控制其操作的变量。
-
它们分为全局变量和会话变量
-
全局变量 影响MySQL服务器的整体操作。例如,
innodb_buffer_pool_size
用于控制InnoDB存储引擎的缓冲池大小。 -
会话变量 只影响当前连接的行为。例如,
sql_mode
可以设置不同的SQL模式,以改变SQL语句的解析和执行方式。 -
可以用
SHOW VARIABLES
来查看系统变量,用SET
语句来设置它们的值。
【2】自定义变量#
-
用户定义变量是由用户创建的,可以在一次连接中传递数据。他们以@符号开始
-
定义的变量不需要手动删除,它和python一样具有垃圾回收机制
-- set 定义变量
set @myvar = 1;
-- select 定义变量
select @myvar:= 1;
-- 查询变量
select @myvar;
【3】局部变量#
- 局部变量是在存储过程或者函数内 定义的,只在定义他们的语句块中有效
-- 定义局部变量语法
declare <变量名> <变量类型> [default <默认值>];
-- 声名(必须紧跟着begin后面写)
delimiter $$
create procedure p1()
begin
declare dep_count int default 0;
set dep_count = (select count(id) from dep);
select dep_count;
end$$
delimiter ;
流程控制函数补充
【1】if函数#
-- if函数用于基于条件表达式执行不同的操作
if(<条件表达式>,<条件为真返回的值>,<条件为假返回的值>)
-- 通过把查询结果的性别变成小哥哥或者小姐姐
select name,if(gender='male','小哥哥','小姐姐') as gender from emp where id < 7;
+--------+-----------+
| name | gender |
+--------+-----------+
| 刘备 | 小哥哥 |
| 关羽 | 小哥哥 |
| 张飞 | 小哥哥 |
| 赵云 | 小哥哥 |
| 马超 | 小哥哥 |
| 黄忠 | 小姐姐 |
+--------+-----------+
【2】case语句#
- case语句在处理多条件判断时更为灵活
- case语句分为简单case和搜索case
-- 简单case
select name,
case gender
when 'male' then '小哥哥'
when 'female' then '小姐姐'
else '保密'
end
from emp;
-- 这样看来简单case就是直接拿查询到的结果做判断
-- 搜索case
select name,
case
when age < 20 then '小奶狗'
when age >= 20 then '小年轻'
when age >= 30 then '小叔叔'
when age >= 40 then '大叔'
else '老前辈'
end
from emp;
-- 搜索case就是将查询到的结果再一次进行比较
【3】coalesce函数#
- coalesce函数用于从其参数列表中返回第一个非null的值,如果所有参数都是null,则最后返回null
-- 语法 (value是函数的参数,可以是任意数量)
coalesce(value1,value2,value3...)
-- 使用场景
-- coalesce 函数在处理可能返回null值的数据时非常好用,它允许你为可能的null值指定一个备选项。这在数据库中是常见的需求,因为NULL值可能会导致计算或结果出现问题。
-- 示例
-- 有一张员工表emp,其中有的员工并没有领导。这时候就可以使用coalesce函数为其设置一个备选值
select name,
coalesce(leader_id,'no leader') as leader
from emp;
【4】nullif函数#
nullif
函数用于比较两个表达式,如果他们两个相等,则返回null- 如果不相等则返回第一个表达式的值
- 这个函数主要用于防止除以0的错误或者处理特定情况下的数据
-- 语法
nullif(<表达式1>,<表达式2>)
-- 使用场景
-- 1.防止除0错误
-- 2.当在特点情况下,希望在两个表达式相等时,将值替换为null
-- 示例
-- 有一张员工表,要计算员工平均薪资。如果有些员工的工资为0,直接除以0会导致错误,这时候就需要nullif函数
循环控制语句补充
- 在MySQL中,循环控制语句主要用于存储过程和函数中,用来重复执行一段代码直到满足特定条件。MySQL提供了三种主要的循环控制结构:
LOOP
循环、REPEAT
循环和WHILE
循环。
【1】loop循环#
LOOP
提供了最基本的循环功能,它会不断地执行一段代码,直到遇到LEAVE
语句。通常与IF
语句一起使用来判断何时退出循环。
-- 语法
[标签:]loop
sql逻辑
leave 标签;
iterate 标签;
end loop [标签];
-- 求和例子
drop procedure if exists p1;
delimiter $$
create procedure p1(in num int)
begin
declare res int default 0;
sum:loop
if num = 5 then
set num = num -1;
iterate sum;
end if;
set res = res + num;
set num = num -1;
if num<=0 then
leave sum;
end if;
end loop;
select res;
end$$
delimiter ;
-- 调用p1
call p1(100)
+------+
| res |
+------+
| 5045 |
+------+
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!