1 代码执行结构
- 代码执行结构有三种:顺序结构、分支结构和循环结构。
1.1 分支结构
- 分支结构:实现准备多个代码块,按照条件选择性执行某段代码。
if 条件判断 then
-- 满足条件要执行的代码
else if
-- 不满足条件要执行的代码
else
-- 不满足条件要执行的代码
end if;
- 触发器结合if分支:判断商品库存是否足够,不够不能生成订单。
-- 触发器结合if分支,判断商品库存是否足够,不够不能生成订单
DELIMITER $$
CREATE TRIGGER insert_before BEFORE INSERT ON `ORDER` FOR EACH ROW
BEGIN
-- 判断商品库存是否足够
-- 获取商品库存:商品库存在表中
SELECT inv FROM goods WHERE id = new.g_id INTO @inv;
-- 比较kuc
IF @inv < new.g_number THEN -- 库存不够
-- 触发器没有提供一个能够阻止事件发生的能力,只能暴力报错
INSERT INTO xxx VALUES(xxx);
END IF;
END
$$
DELIMITER ;
1.2 循环结构
while 条件判断 do
-- 满足条件要执行的代码
-- 变更循环条件
end while;
循环控制:在循环内部进行循环判断和控制
MySQL中没有对应的continue和break;
iterate:类似于continue
leave:类似于break
iterate和leave的使用方式: iterate/leave 循环名字;
-- 定义循环名字
循环名字:while 条件 do
-- 循环体
-- 循环控制
end while;
2 函数
- 函数:将一段代码块封装到一个结构中,在需要执行代码块的时候,调用结构执行即可(代码复用)。
2.1 系统函数
- 系统定义好的函数,直接调用即可。
- 任何函数都有返回值,因此函数的调用都是通过select调用。
- substring(str,offset,len):从offset(MySQL中的自妇产的下标是从1)开始,截取长度是len。
SET @cn = '世界你好';
SET @en = "hello world";
-- 字符串截取
,),,);
- char_length:字符长度
- length:字节长度
SET @cn = '世界你好';
SET @en = "hello world";
-- 字符串长度
SELECT CHAR_LENGTH(@cn),CHAR_LENGTH(@en),LENGTH(@cn),LENGTH(@en);
- instr:判断字符串是否在某个字符串中存在,存在,返回位置;失败,返回0。
SET @cn = '世界你好';
SET @en = "hello world";
SELECT INSTR(@cn,'你');
- Lpad:左填充,将字符串按照某个指定的填充方式,填充到指定长度。
SET @cn = '世界你好';
SET @en = "hello world";
,'呵呵');
- strcmp:compare,字符串比较,小,就返回-1;相等,就返回0;大,就返回1。
SET @a = 'hello';
SET @b = 'hei';
SET @c = 'HEI';
SELECT STRCMP(@a,@b),STRCMP(@b,@c),STRCMP(@c,@a);
2.2 自定义函数
- 函数要素:函数名,参数列表,返回值,函数体(作用域)。
-- 创建函数
CREATE FUNCTION 函数名([形参列表]) RETURNS 数据类型
BEGIN
-- 函数体
-- 返回值
RETURN 返回值(指定数据类型);
END;
DELIMITER $$
CREATE FUNCTION dis() RETURNS INT
BEGIN
;
END
$$
DELIMITER ;
2.3 查看函数
show function status [like 'pattern'];
2.4 修改函数&删除函数
2.5 函数参数
- 函数分为两种:定义的参数叫形参,调用时的参数叫实参。
DELIMITER $$
CREATE FUNCTION 函数名 (形参名字 数据类型) RETURNS 数据类型
BEGIN
-- 函数体
-- 返回值
RETURN 返回值;
END;
$$
DELIMITER ;
DELIMITER $$
CREATE FUNCTION res (num INT) RETURNS INT
BEGIN
;
;
WHILE @i <= num DO
SET @sum = @sum + @i;
;
END WHILE;
RETURN @sum;
END;
$$
DELIMITER ;
2.6 函数的作用域
- MySQL中的作用域与js中的作用域完全一样。
- 全局变量可以在任何地方使用;局部变量只能在函数内部使用。
- 全局变量:使用set关键字定义,使用@符号定义。
- 局部变量:使用declare关键字声明,没有@符号,所有的局部变量的声明,必须在函数体开始之前。
DELIMITER $$
CREATE FUNCTION res (num INT) RETURNS INT
BEGIN
;
;
WHILE i <= num DO
SET SUM = SUM +i;
;
END WHILE;
RETURN SUM;
END;
$$
DELIMITER ;
3 存储过程
- 存储过程:简称过程,procedure,是一种用来处理数据的方式。
- 存储过程是一个没有返回值的函数。
3.1 创建存储过程
DELIMITER $$
CREATE PROCEDURE 过程名字([参数列表])
BEGIN
-- 过程体
END
$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE proe()
BEGIN
-- 过程体
SELECT * FROM my_account;
END
$$
DELIMITER ;
3.2 查看存储过程
- 查看所有的存储过程。
- show procedure status [like 'pattern'];
- 查看创建过程语句
- show create procedure 存储过程名字;
3.3 调用过程
- 因为存储过程是没有返回值的,所以不能使用select关键字。
3.4 修改过程&删除过程
- 存储过程不可以修改,只能先删除,再新增存储过后才能。
3.5 存储过程参数类型
- 过程还有自己的类型限定:三种类型
- ① in:数据从外部传入给内部使用(值传递):可以是数值也可以是变量
- ②out:只允许过程内部使用(不用外部数据),给外部使用的(引用传递,外部的数据会被先清空才进入内部),只能是变量。
- ③inout:外部的可以在内部使用,内部修改也可以给外部使用,典型的引用传递,只能传递变量。
DELIMITER $$
CREATE PROCEDURE 过程名 (IN 形参名称 数据类型,OUT 形参名称 数据类型,INOUT 形参名称 数据类型)
BEGIN
-- 过程体
END;
$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE pro1 (IN int_1 INT,OUT int_2 INT,INOUT int_3 INT)
BEGIN
-- 过程体
SELECT INT_1,INT_2,INT_3;
END;
$$
DELIMITER ;
- 调用:out和inout类型的参数必须传入变量,而不是是数值。
;
;
;
SELECT @int_1,@int_2,@int_3;
CALL pro1(@int_1,@int_2,@int_3);
SELECT @int_1,@int_2,@int_3;