Mysql面试题八

存储过程(SQL中的脚本):

Sql语句需要先编译后执行

​ 存储过程是一组为了完成特定功能的Sql语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数来调用执行它。

存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的,如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。

优点:

  1. 存储过程是预编译过的,执行效率高。会省去分析优化等操作。
  2. 存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯
  3. 安全性高,执行存储过程需要有一定权限的用户。
  4. 存储过程可以重复使用,减少数据库开发人员的工作量。
  5. 增强sql语言的功能和灵活性:可以用控制语句编写,有很强灵活性。可以完成复杂判断的复杂运算。

缺点:

1.调试麻烦。

2.移植问题,数据库款代码当然是与数据库相关。

3.重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译。

编译过程的使用:

创建编译过程:

create procedure testa()
  begin
     select * from user
   end;  

删除存储过程:

drop procedure testa;

创建带有变量的存储过程:变量的作用范围在begin和end之间。begin end可以进行嵌套。

create procedure testa()
begin
  declare username varchar(20) default ' '; -- 声明一个变量
  set username='yangxiao';                        -- 给变量赋值
  select name into username from user where id=1; -- 将查询之后的值赋值给变量
  select username;   -- 返回变量
 end;

存储过程参数

基本语法:

create procedure 名称([IN|ON|INOUT] 参数名 参数数据类型)
begin 
......
end;

存储过程的传入参数IN

  1. 传入参数:类型为in,表示该参数的值必须在调用存储过程事指定,如果不显示指定为in,那么默认就是in类型。
  2. N类型参数一般只用于传入,在调用过程中一般不作为修改和返回
 create procedure test4(userId int)
    begin
            declare username varchar(32) default '';
            declare ordercount int default 0;
            select name into username from users where id=userId;
            select username;
    end;

存储过程的传出参数out

  1. 传出参数:在调用存储过程中,可以改变其值,并可返回;
  2. out是传出参数,不能用于传入参数值
  3. 调用存储过程时,out参数也需要指定,但必须是变量,不能是常量
create procedure test5(in userId int,out username varchar(32))
        begin
            select name into username from users where id=userId;
        end;
        
        
-- 定义一个变量  ,进行使用
set @name='';
call test5(1,@name);
select @name as username;

存储过程的可变参数INOUT

  1. 调用时可传入值,在调用过程中,可修改其值,同时也可返回值。
  2. 集合in和out的参数功能
  3. 不能是常量。

存储过程条件语句

条件语句基本结构

if() then ...else...end if;

多条件判断语句:

if() then...
elseif() then...
else ... 
end if;

存储过程循环语句

while语句

while(表达式) do
  ......
end while;  

repeat语句:until为真退出循环

repeat ... until...end repeat;

定义事件event的格式

create event[IF NOT EXISTS]event_name -- 创建使用create event
    ON SCHEDULE schedule -- on schedule 什么时候来执行
    [ON COMPLETION [NOT] PRESERVE] -- 调度计划执行完成后是否还保留
    [ENABLE | DISABLE] -- 是否开启事件,默认开启
    [COMMENT 'comment'] -- 事件的注释
    DO sql_statement; -- 这个调度计划要做什么?

定义事件调用存储过程

create procedure testa()
begin
   insert into user(date) now();
 end;
 
 create event testevent
 on schedule every 3 minute -- 每三分执行
 on completion preserve 
 DO call test();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值