Skip to content

存储过程和函数

预处理

所谓预处理技术,最初也是有MySQL提出的一种减轻服务器压力的一种技术

  • 传统mysql处理流程
  1. 在客户端准备sql语句
  2. 发送sql语句到MySQL服务器
  3. MySQL服务器对sql语句进行解析(词法、语法),然后编译,然后执行该sql语句
  4. 服务器将执行结果返回给客户端
  • 弊端:
  • 哪怕多次传递的语句大部分内容是相同的,每次还是需要重复传递
  • 哪怕语句是相同的,每次执行之前还是要先解析、编译后才执行
  • 预处理的处理流程
  1. 在客户端准备sql语句 prepare 预处理名称 from 'sql语句'prepare stmt from 'select * from stu where id=?;';
  2. 发送预处理sql语句到MySQL服务器
  3. MySQL服务器对预处理sql语句进行解析(词法、语法),但不会执行
  4. 在客户端准备相关数据 set @id=1;
  5. MySQL服务器对数据和预处理sql编译,然后执行该sql语句 execute stmt using @id
  6. 服务器将执行结果返回给客户端
  • 优点:
  • 只对sql语句进行了一次解析
  • 重复内容大大减少(网络传输更快)
  • 如何在MySQL中定义变量
  • 定义全局变量:@变量名称

    • 赋值:set @变量名称=值 select 字段名称 into @全局变量名称 from 表名;
  • 局部变量 declare 变量名称 数据类型;

  • 赋值: set 局部变量名称 = 值; select 字段名称 into 局部变量名称 from 表名;

存储过程

存储过程和其他编程语言的函数很像,可以用于封装一组特定功能的SQL语句集,用户通过'call 存储过程的名称()'来调用执行它

存储过程的基本语法

  1. 定义
sql

create procedure 存储过程名称(形参列表)

begin

// sql语句
// ... ...

end;

  1. 调用

call 存储过程名称(参数);

查看存储过程

  1. 查看MySQL中所有存储过程
sql

show procedure status;

  1. 查看指定数据库中的存储过程
sql

show procedure status where db='数据库名称';

  1. 查看指定存储过程的源代码
sql

show create procedure 存储过程名称;

  1. 删除一个存储过程
sql

drop procedure 存储过程名称;

  1. 存储过程中定义局部变量
sql

create procedure show_stu()

begin
    # declare stuId int;
    # 定义默认值
    declare stuId int default 1;
    set stuId = 0;
    select * from stu where id = stuId;
end;

  1. 存储过程参数:
  • MySQL存储过程中的参数分为:
    • in 输入参数[默认]
    • out 输出参数
    • inout 输入输出参数

自定义函数

自定义函数和存储过程很像,只不过自定义函数不需要手动通过call调用, 而是和其他的聚合函数一样会在SQL语句中会自动被调用

创建一个自定义函数

sql

create function 函数名(形参列表) returns 数据类型 函数特征
begin

sql语句;
...
return 值;

end;

  • 函数特征
  1. DETERMINISTIC 不确定的 (一般写这个不确定即可)
  2. NO SQL 没有SQL语句,当然也不会修改数据
  3. READS SQL DATA

条件语句

  1. IF语句
sql

if 条件表达式 then

... ...

elseif 条件表达式 then

... ...

end if;

  1. CASE 语句
sql

case 
when 条件表达式 then
... ...
when 条件表达式 then
... ...
end case;

  1. 循环语句
  • while 循环
sql

while 条件表达式 do 

... ...

end while;

  • repeat 循环
sql

repeat 

... ...

until 条件表达式 end repeat;

练习:批量数据处理

  • 需求:往数据库里存储一万条数据

实现方案:

  1. 写一万条insert into语句
  2. 将insert into 语句封装到存储过程或者函数中 将来怎么使用? 是配合其他SQL语句使用,还是单独使用 单独使用 -- 存储过程 配合其他SQL语句使用 -- 自定义函数
  • 使用存储过程插入1w条数据用时较长 #48.428s

Released under the MIT License.