加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_汕头站长网 (https://www.0754zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL高级进阶二:自定义函数,自定义变量,常用函数以及存储过程

发布时间:2022-09-13 15:58:48 所属栏目:MySql教程 来源:
导读:  代码执行结构

  代码执行结构有3种:顺序结构、分支结构和循环结构

  分支结构

  准备多个代码块,按照条件选择性的执行。

  在mysql中只有if分支

  基本语法:

  If 判定条
  代码执行结构
 
  代码执行结构有3种:顺序结构、分支结构和循环结构
 
  分支结构
 
  准备多个代码块,按照条件选择性的执行。
 
  在mysql中只有if分支
 
  基本语法:
 
  If 判定条件 then
 
  -----满足条件要执行的代码
 
  Else
 
  -----不满足条件要执行的代码
 
  End if
 
  下面通过一个案例来了解这种分支结构mysql自定义函数教程,首先准备操作数据
 
  CREATE TABLE my_goods(
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(20) NOT NULL,
  price DECIMAL(10,2) DEFAULT 1,
  inv INT COMMENT '库存数量'
  )CHARSET utf8;
  
  INSERT INTO my_goods VALUES(NULL,'iPhone6s',5288,100),(NULL,'s6','6088',100);
  
  SELECT * FROM my_goods;
  
  CREATE TABLE my_order(
  id INT PRIMARY KEY AUTO_INCREMENT,
  g_id INT NOT NULL COMMENT '商品ID',
  g_number INT COMMENT '商品数量'
  )CHARSET utf8;
  SHOW CREATE TABLE  my_order;
  
  SELECT * FROM my_order;
  建立一个触发器,判断商品的库存是否足够,不够不能生产订单
 
  DELIMITER $$
  CREATE TRIGGER after_order AFTER INSERT ON my_order FOR EACH ROW
  BEGIN
   SELECT inv FROM my_goods WHERE id = new.g_id INTO @inv;
   IF @inv < new.g_number THEN
   INSERT INTO xxx VALUE ();
   ELSE
   UPDATE my_goods SET inv = inv - new.g_number WHERE id = new.g_id;
   END IF;
  END
  $$
  DELIMITER ;
  这时候如果商品库存不够,就会直接报错
 
  循环结构
 
  某段代码在指定的条件内重复执行
 
  只有While循环,没有for循环
 
  语句格式
 
  While 判定条件 do
  ? ? ?--满足条件要执行的代码
  ? ? ?-- 变更循环的条件
  End while
  循环控制
 
  在循环内部进行循环的判定与控制
 
  Mysql中没有对应continue和break关键字,但是有替代品
 
  Iterate:迭代,类似于continue,后面的代码不执行,进入下一次循环
 
  Leave:离开,类似于break,整个循环结束。
 
  常见:in,any也可以在while中使用
 
  函数
 
  将一段代码封装到一个结构中,在需要执行这段代码的时候,调用结构执行即可,代码的重用。
 
  函数分为2种:系统函数,自定义函数
 
  系统函数
 
  系统已经定义好的函数,直接调用即可,
 
  任何函数都有返回值,因此函数的调用是通过select调用
 
  substring();
 
  字符串截取(字符为单位)
 
  SET @cn = '世界你好';
  SET @en = 'hello world';
  SELECT SUBSTRING(@cn,1,2);
  SELECT SUBSTRING(@en,1,2);
  Char_length();
 
  字符长度
 
  SELECT CHAR_LENGTH(@cn);
  SELECT CHAR_LENGTH(@en);
  Length
 
  字节长度
 
  SELECT LENGTH(@cn);
 
  SELECT LENGTH(@en);
  Instr
 
  .判定字符串是否存在某个子串,存在返回位置,0代表没找着
 
  SELECT INSTR(@en,'he'),INSTR(@cn,'he');
  Lpad
 
  左填充:将字符串按照某种方式进行填充
 
  SELECT LPAD(@en,21,"123");
  Insert
 
  替换,找到目标位置,指定长度的字符串 ,替换成 目标字符串
 
  SELECT INSERT(@en,2,5,"AAAAA");
  Strcmp
 
  字符串比较,一样返回0,t1>t2返回1,t1
 
  SET @t1 = "aaa";
  SET @t2 ="aa";
  SELECT STRCMP(@t1,@t2);
  自定义函数
 
  函数3要素:函数名称、参数列表(形参和实参),函数体
 
  创建函数语法
 
  Create function 函数名(【形参列表】) retrurns 数据类型
  ???????? Begin
  ?????????????????? --函数体
  ?????????????????? --返回值:return XXX;
  ???????? End
  案例如下,如果begin与end中只有一条语句,这两个关键字可以省略
 
  CREATE FUNCTION display()
  RETURNS INT
   RETURN 100;
  调用函数
 
  SELECT display();
  查看函数 查看所有函数
 
  SHOW FUNCTION STATUS ;
  查看函数创建语句
 
  SHOW CREATE FUNCTION display;
  修改函数&删除函数
 
  函数不能修改,只能删掉重写来
 
  Drop function 函数名
 
  下面自定义一个函数,实现1---x的累加和
 
  DELIMITER $$
  CREATE FUNCTION my_sum(X INT) RETURNS INT
  BEGIN
      SET @i = 1;
      SET @SUM = 0;
      WHILE @i <= X DO
          SET @SUM = @SUM + @i;
          SET @i = @i + 1;
      END WHILE;
      RETURN @SUM;
  END
  $$
  DELIMITER ;
  函数参数
 
  上面定义的函数的参数@i与@sum,在函数外部也可以访问,相当于类中的全局变量
 
  参数作用域 Mysql中作用域和js中作用域是一样的
 
  全局变量可以任何地方定义,
 
  局部变量只能在函数内部定义
 
  全局变量:
 
  使用set关键字定义,使用@符号标记
 
  局部变量:
 
  使用declare关键字声明,没有@符号,
 
  所有的局部变量的声明,必须在函数体开始之前,放在begin下面
 
  DELIMITER $$
  CREATE FUNCTION display2(index_1 INT ) RETURNS INT
  BEGIN
   DECLARE userName VARCHAR(100) DEFAULT 'love';
   SET @i = 1;
   RETURN index_1;
  END
  $$
  DELIMITER ;
  SELECT display2(50);
  SELECT @i;
  存储过程
 
  存储过程简称:过程mysql自定义函数教程,procedure,是一种用来处理数据的方式
 
  存储过程是一种没有返回值的函数。
 
  创建过程
 
  语法:
 
  Create procedure 过程名称(参数列表)
 
  ???????? Begin
  ?????????????????? 过程体
  ???????? End
  DELIMITER $$
  CREATE PROCEDURE pro1()
  BEGIN
   SELECT
   *
   FROM
   emp;
  END
  $$
  DELIMITER ;
  查看过程 查看所有过程
 
  Show procedure status 【like ‘pattern’】
  SHOW PROCEDURE STATUS;
  查看过程创建语句
 
  SHOW CREATE PROCEDURE pro1;
  调用过程
 
  过程没有返回值,所有不能使用select调用
 
  过程有一个专门的关键字:call
 
  call pro1();
  修改过程&删除过程
 
  过程只能删除,后新增
 
  Drop procedure 过程名
 
  DROP PROCEDURE pro1;
  过程参数(难点)
 
  函数的参数需要指定数据类型的,过程比函数更加严格。
 
  过程还有自己的类型的限制:3种类型
 
  In:数据只是从外部传入到内部使用(值传递)
 
  Out:只允许过程内部使用(不用外部数据),变量到达内部之后,外部数据会被清空
 
  只能传递变量。
 
  Inout:外部可以在内部使用,内部修改之后也可以在外部使用
 
  类似于java中引用传递
 
  只能传递变量
 
  基本使用
 
  Create procedure 过程名(in 形参名称 数据类型,out形参名称 数据类型 inout形参名称 数据类型)
 
  下面用一个案例来理解上面参数的含义与用法
 
  DELIMITER $$
  CREATE PROCEDURE pro2(IN int_1 INT,OUT int_2 INT,INOUT int_3 INT)
  BEGIN
   #先查看3个变量的值,int_2一定为null
   SELECT int_1,int_2,int_3;
  
   #修改局部变量
   SET int_1 = 10;
   SET int_2 = 100;
   SET int_3 = 1000;
  
   #查看3个局部变量的值
   SELECT int_1,int_2,int_3;
  
   #查看3个全局变量的值
   SELECT @int_1,@int_2,@int_3;
  
   SET @int_1 = 'a';
   SET @int_2 = 'b';
   SET @int_3 = 'c';
  
   #查看3个全局变量的值
   SELECT @int_1,@int_2,@int_3;
  END
  $$
  DELIMITER ;
  下面来调用这个存储过程
 
  SET @int_1 := 1;
  SET @int_2 := 2;
  SET @int_3 := 3;
  SELECT @int_1,@int_2,@int_3;
  CALL pro2(@int_1,@int_2,@int_3);

  储过程对一变量的操作的是滞后:是在存储过程结束的时候,才会重新将内部修改的值 赋值给外部传入的全部变量。
 
  最后:是在存储过程调用结束后,系统会将局部变量的值返回给全部变量
 

(编辑:云计算网_汕头站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!