MySQL高级进阶二:自定义函数,自定义变量,常用函数以及存储过程
发布时间:2022-09-13 15:58:48 所属栏目:MySql教程 来源:
导读: 代码执行结构
代码执行结构有3种:顺序结构、分支结构和循环结构
分支结构
准备多个代码块,按照条件选择性的执行。
在mysql中只有if分支
基本语法:
If 判定条
代码执行结构有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); 储过程对一变量的操作的是滞后:是在存储过程结束的时候,才会重新将内部修改的值 赋值给外部传入的全部变量。 最后:是在存储过程调用结束后,系统会将局部变量的值返回给全部变量 (编辑:云计算网_汕头站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐



浙公网安备 33038102330478号