0
点赞
收藏
分享

微信扫一扫

mysql 存储过程

柠檬果然酸 2022-04-27 阅读 71
mysql

——————————————数据库

表(table):有行有列,行又叫记录,列又叫(属性)字段

在数据库中建立临时表:

Create  table 表名 as  select  *  from 表名 [查询条件];

  Create  table  emp111  as  select  *  from  emp;     -----创建的临时表不会继承原表的主外键约束,但表结构和表数据是一样的

索引(index):加快检索的速度,是优化数据库查询效率的常见方法之一

        加快了数据库的检索速度,但是降低了删除、修改、插入等维护类的任务的执行速度

Create  index  索引名  on  表名(列名);

删除索引:drop  index  名称 on 表名(列名);

————————————————————存储过程

Mysql 5.0以后版本中才开始支持存储过程

存储过程:是一种在数据库中存储的复杂的程序,以便外部程序或其他应用程序对数据进行调用的数据库对象。

两个要点:存储在数据库中  复杂的程序

                 被调用

       存储过程就是在数据库中编写代码,目的是为了完成特定的任务或功能的SQL的集合,

它是一个语句集,经过编写保存在数据库中,可以让指定的用户对其进行调用,提成效率。

      即:是数据库中SQL层面的代码的封装和调用

优点:

  1. 可封装,并且隐藏复杂的商业逻辑
  2. 可以进行回传值,并且可以接收参数
  3. 可以让复杂的语句封装成简单的函数或者子程序
  4. 可以用在数据库效验,企业规则,内部逻辑比较复杂的业务上

缺点:

  1. 存储过程对数据库的依赖很大,定制化在特定的数据库上,支持的语言规范不一样
  2. 可移植性一般,复用率低
  3. 无法直接使用select指令进行运行,因为是子程序

Create  procedure  过程名([in  out  inout] 参数名  数据类型,[in  out  inout]参数名  数据类型,…)

Begin;

        过程体;

End;

存储过程中的参数:

Mysql中参数的定义,一共支持三种类型:in  out  inout

     In(输入参数):表示调用者向过程传入值(可以是具体的值,也可以是变量)

     Out(输出参数):表示过程向调用者传出值(可以返回多个值,传出的值只能是变量)

     Inout(输入输出参数):表示调用者向过程传入值,也可表示过程向调用者传出值(值只能是变量)

建议:输入值用in,输出值用out,inout参数尽量少用

过程体:

           由合法的SQL语句构成,即SQL命令集,可执行,过程体包含了过程调用执行的所有SQL语句:如DQL、DML、DDL、if-then-else等,以及申明变量

过程体的格式:以begin开始,end结束(可以嵌套)

                        每个嵌套块中每条命令的结束,都必须以;结束

调用:1.可以使用一个call命令通过名字对存储进行调用:

                Call 存储过程的名();

           2.可以供外部程序调用,比如java、pythen

修改界定符(delimiter):为//或者$$,目的是让;暂时失效,不表示语句结束

 Delimiter $$

 Create  procedure 过程名()

 Begin

            过程体;

 End;

 $$

调用:call  过程名;      call 过程名();

          每调用一次存储过程,就相当于把过程体执行一次

         调用的时候,没有参数的存储过程,()可加可不加

Delimiter //

Create  procedure  过程名(in  参数  数据类型)

Begin

        Select  参数  from  表名;

End;

//

Call  过程名(参数的值);

把查询SQL放在过程体中:

          根据输入的部门编号,查询部门的员工信息

          Delimiter  //

          Create  procedure  select22(in  ptno  int)

          Begin

                  Select  *  from  emp  where  deptno=ptno;

          End;

          //

          Call  select22(10);

如果参数名称和列名一致时,则参数会被当成整个列的情况,即使输入参数值,查询的结果始终是整个列所有的信息(即所有部门员工),参数失效;如果删除的是存储,则删除的是整个数据

DELIMITER//

CREATE PROCEDURE del_user_name(IN name1 VARCHAR(50))

BEGIN

         DELETE FROM user_tab WHERE user_name=name1;

END;

CALL del_user_name('孙权');

存储过程编写思路:

前提:进入数据,保证可以正常使用存储过程要执行的数据库

  1. 修改mysql界定符(语句结束语):

Delimiter  //  或者delimiter  $$

     2. 创建存储过程:

Create  procedure  过程名(in/out/inout  参数  数据类型)

Begin

         过程体;

End;//

     3.调用:

Call  过程名(参数值)

带变量的存储过程:

         变量:变量在存储过程中的使用,和编程的使用的过程类似,可以进行申明变量,用来取一类值。

         用户变量:set @变量名=变量值

                 例:set @name=123;

                        Select @name;

备注:用户变量,只是针对用户的创建者可以使用,用户断开以后,用户变量就会被销毁

作用:将SQL语句查询的结果存入用户变量,方面后面使用。

DELIMITER//

CREATE PROCEDURE gc11(IN name1 VARCHAR(50),OUT num1 INT)

BEGIN

           DELETE FROM biao1 WHERE bname=name1;

           SELECT COUNT(*) FROM biao1 INTO num1;

           SET @nums=num1;

END;

SELECT * FROM biao1;

CALL gc('周瑜',@nums);     -- 把count()统计结果放在用户变量@nums这里

SELECT @nums;        # 用 select 来查看验证结果   

注意:不建议频繁使用用户变量,滥用用户变量会导致存储过程很难理解和管理

用户变量的特点决定的:

  1. 每个用户都可以创建属于自己的私有变量,称为用户变量
  2. 用户变量用来临时存放一些数据,一旦用户下线,变量就失效销毁
  3. 用户变量只能定义者使用,其他用户无权使用

  局部变量:只是在存储过程中使用

定义方式:declare 变量名称 数据类型 default  0;      ---defauil o表示变量默认值为0,不是所有变量值都需要默认值

  例:declare aa int default 0;     ---定义申明变量aa为int类型,默认值为0

         Declare aa int ;         ---定义aa为int类型的变量

         Set  aa=0;      ---给变量aa赋值为0

例如:定义两个局部变量,并且赋值,将这两个局部变量的值求和

  Delimiter  //

  Create  procedure  s1()

  Begin

          Declare  aa  int;

          Declare  bb  int;

          Set  aa=10;

          Set  bb=20;

           Set  @cc=aa+bb;

  End;

  Call  s1(111,222)

  Select  @cc;

举报

相关推荐

0 条评论