MySQL高级进阶二

代码执行结构

代码执行结构有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调用

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<t2,返回-1

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;

存储过程

存储过程简称:过程,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);

 用结果图可以更明显的看到效果

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

最后:是在存储过程调用结束后,系统会将局部变量的值返回给全部变量

猜你喜欢

转载自blog.csdn.net/h1025372645/article/details/89155053
今日推荐