代码执行结构有3种:顺序结构、分支结构和循环结构
准备多个代码块,按照条件选择性的执行。
在mysql中只有if分支
基本语法:
If 判定条件 then
-----满足条件要执行的代码
Else
-----不满足条件要执行的代码
End if
下面通过一个案例来了解这种分支结构,首先准备操作数据
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调用
字符串截取(字符为单位)
SET @cn = '世界你好';
SET @en = 'hello world';
SELECT SUBSTRING(@cn,1,2);
SELECT SUBSTRING(@en,1,2);
字符长度
SELECT CHAR_LENGTH(@cn);
SELECT CHAR_LENGTH(@en);
字节长度
SELECT LENGTH(@cn);
SELECT LENGTH(@en);
.判定字符串是否存在某个子串,存在返回位置,0代表没找着
SELECT INSTR(@en,'he'),INSTR(@cn,'he');
左填充:将字符串按照某种方式进行填充
SELECT LPAD(@en,21,"123");
替换,找到目标位置,指定长度的字符串 ,替换成 目标字符串
SELECT INSERT(@en,2,5,"AAAAA");
字符串比较,一样返回0,t1>t2返回1,t1 函数3要素:函数名称、参数列表(形参和实参),函数体 案例如下,如果begin与end中只有一条语句,这两个关键字可以省略 函数不能修改,只能删掉重写来 Drop function 函数名 下面自定义一个函数,实现1---x的累加和 上面定义的函数的参数@i与@sum,在函数外部也可以访问,相当于类中的全局变量 全局变量可以任何地方定义, 局部变量只能在函数内部定义 使用set关键字定义,使用@符号标记 使用declare关键字声明,没有@符号, 所有的局部变量的声明,必须在函数体开始之前,放在begin下面 存储过程简称:过程,procedure,是一种用来处理数据的方式 存储过程是一种没有返回值的函数。 语法: 过程没有返回值,所有不能使用select调用 过程有一个专门的关键字:call 过程只能删除,后新增 Drop procedure 过程名 函数的参数需要指定数据类型的,过程比函数更加严格。 过程还有自己的类型的限制:3种类型 In:数据只是从外部传入到内部使用(值传递) Out:只允许过程内部使用(不用外部数据),变量到达内部之后,外部数据会被清空 只能传递变量。 Inout:外部可以在内部使用,内部修改之后也可以在外部使用 类似于java中引用传递 只能传递变量 Create procedure 过程名(in 形参名称 数据类型,out形参名称 数据类型 inout形参名称 数据类型) 下面用一个案例来理解上面参数的含义与用法 下面来调用这个存储过程 用结果图可以更明显的看到效果 储过程对一变量的操作的是滞后:是在存储过程结束的时候,才会重新将内部修改的值 赋值给外部传入的全部变量。 最后:是在存储过程调用结束后,系统会将局部变量的值返回给全部变量SET @t1 = "aaa";
SET @t2 ="aa";
SELECT STRCMP(@t1,@t2);
自定义函数
创建函数语法
Create function 函数名(【形参列表】) retrurns 数据类型
Begin
--函数体
--返回值:return XXX;
End
CREATE FUNCTION display()
RETURNS INT
RETURN 100;
调用函数
SELECT display();
查看函数
查看所有函数
SHOW FUNCTION STATUS ;
查看函数创建语句
SHOW CREATE FUNCTION display;
修改函数&删除函数
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 ;
函数参数
参数作用域
Mysql中作用域和js中作用域是一样的
全局变量:
局部变量:
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;
存储过程
创建过程
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;
调用过程
call pro1();
修改过程&删除过程
DROP PROCEDURE pro1;
过程参数(难点)
基本使用
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);