Appearance
存储过程和函数
预处理
所谓预处理技术,最初也是有MySQL提出的一种减轻服务器压力的一种技术
- 传统mysql处理流程
- 在客户端准备sql语句
- 发送sql语句到MySQL服务器
- MySQL服务器对sql语句进行解析(词法、语法),然后编译,然后执行该sql语句
- 服务器将执行结果返回给客户端
- 弊端:
- 哪怕多次传递的语句大部分内容是相同的,每次还是需要重复传递
- 哪怕语句是相同的,每次执行之前还是要先解析、编译后才执行
- 预处理的处理流程
- 在客户端准备sql语句
prepare 预处理名称 from 'sql语句'prepare stmt from 'select * from stu where id=?;'; - 发送预处理sql语句到MySQL服务器
- MySQL服务器对预处理sql语句进行解析(词法、语法),但不会执行
- 在客户端准备相关数据
set @id=1; - MySQL服务器对数据和预处理sql编译,然后执行该sql语句
execute stmt using @id - 服务器将执行结果返回给客户端
- 优点:
- 只对sql语句进行了一次解析
- 重复内容大大减少(网络传输更快)
- 如何在MySQL中定义变量
定义全局变量:@变量名称
- 赋值:set @变量名称=值 select 字段名称 into @全局变量名称 from 表名;
局部变量 declare 变量名称 数据类型;
- 赋值: set 局部变量名称 = 值; select 字段名称 into 局部变量名称 from 表名;
存储过程
存储过程和其他编程语言的函数很像,可以用于封装一组特定功能的SQL语句集,用户通过'call 存储过程的名称()'来调用执行它
存储过程的基本语法
- 定义
sql
create procedure 存储过程名称(形参列表)
begin
// sql语句
// ... ...
end;
- 调用
call 存储过程名称(参数);
查看存储过程
- 查看MySQL中所有存储过程
sql
show procedure status;
- 查看指定数据库中的存储过程
sql
show procedure status where db='数据库名称';
- 查看指定存储过程的源代码
sql
show create procedure 存储过程名称;
- 删除一个存储过程
sql
drop procedure 存储过程名称;
- 存储过程中定义局部变量
sql
create procedure show_stu()
begin
# declare stuId int;
# 定义默认值
declare stuId int default 1;
set stuId = 0;
select * from stu where id = stuId;
end;
- 存储过程参数:
- MySQL存储过程中的参数分为:
- in 输入参数[默认]
- out 输出参数
- inout 输入输出参数
自定义函数
自定义函数和存储过程很像,只不过自定义函数不需要手动通过call调用, 而是和其他的聚合函数一样会在SQL语句中会自动被调用
创建一个自定义函数
sql
create function 函数名(形参列表) returns 数据类型 函数特征
begin
sql语句;
...
return 值;
end;
- 函数特征
- DETERMINISTIC 不确定的 (一般写这个不确定即可)
- NO SQL 没有SQL语句,当然也不会修改数据
- READS SQL DATA
条件语句
- IF语句
sql
if 条件表达式 then
... ...
elseif 条件表达式 then
... ...
end if;
- CASE 语句
sql
case
when 条件表达式 then
... ...
when 条件表达式 then
... ...
end case;
- 循环语句
- while 循环
sql
while 条件表达式 do
... ...
end while;
- repeat 循环
sql
repeat
... ...
until 条件表达式 end repeat;
练习:批量数据处理
- 需求:往数据库里存储一万条数据
实现方案:
- 写一万条insert into语句
- 将insert into 语句封装到存储过程或者函数中 将来怎么使用? 是配合其他SQL语句使用,还是单独使用 单独使用 -- 存储过程 配合其他SQL语句使用 -- 自定义函数
- 使用存储过程插入1w条数据用时较长 #48.428s