一、MySQL流程控制

MySQL中的流程控制结构可分为3类如下:

  • 顺序结构:就是按照顺序正常执行下去
  • 分支结构:if、case等
  • 循环结构:loop、while、repeat等

二、分支结构

2.1.IF函数

语法:

IF(expr1,expr2,expr3)

执行:如果expr1成立,执行expr2,否则执行expr3

2.2.CASE结构

2.2.1实现switch CASE 功能

语法:

CASE 变量|表达式|字段
WHEN 要判断的值1 THEN 返回的值1
WHEN 要判断的值2 THEN 返回的值2
...
ELSE 要返回的值n
END

2.2.2.实现多重 IF

语法:

CASE 
WHEN 表达式1 THEN 返回的值1
WHEN 表达式2 THEN 返回的值2
...
ELSE 要返回的值n
END

以上的CASE是作为表达式使用,表达式的结果是个值

2.2.3 实现 switch CASE 但以语句的形式存在,作为语句只能放在BEGIN END中

语法:

CASE 变量|表达式|字段
WHEN 要判断的值1 THEN 语句1;
WHEN 要判断的值2 THEN 语句2;
...
ELSE 语句n;
END CASE;

2.2.4 实现多重 IF 但以语句的形式存在

语法:

CASE 
WHEN 表达式1 THEN 语句1;
WHEN 表达式2 THEN 语句2;
...
ELSE 语句n;
END CASE;

特点:

  • CASE 结构作为独立语句时,只能放在BEGIN END
  • ELSE 可以省略,但是不建议省略,默认是ELSE NULL
  • WHEN中的条件满足,则执行THEN后的语句,执行完结束,都不满足执行ELSE后的语句
#案例1:创建存储过程,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
DELIMITER //

CREATE PROCEDURE test1(IN scores INT)
BEGIN
    CASE
        WHEN scores >= 90 AND scores <=100 THEN SELECT 'A';
        WHEN scores >=80 THEN SELECT 'B';
        WHEN scores >=60 THEN SELECT 'C';
        ELSE SELECT 'D';
    END CASE; # end case不能省略,表示结束循环

END //

DELIMITER ;

# 调用
CALL test1(74)

2.3.if结构(1.1是IF函数,注意区分)

  • 功能:实现多重分支,仅能用在BEGIN END中
  • 语法:(可以说是最像高级语言的IF结构)
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
...
ELSE 语句n;
END IF;

案例2:使用if结构,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D

DELIMITER //
CREATE FUNCTION test2(scores INT(10)) RETURNS VARCHAR(1)
READS SQL DATA
BEGIN
    IF scores>=90 AND scores <= 100 THEN RETURN 'A';
    ELSEIF scores >= 80 THEN RETURN 'B';
    ELSEIF scores >= 60 THEN RETURN 'C';
    ELSE RETURN 'D';
    END IF; #必须添加
END//
DELIMITER ;

案例3:使用if结构 创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500

DROP PROCEDURE test3

DELIMITER //
CREATE PROCEDURE test3(IN salary DOUBLE)
BEGIN
    IF salary < 2000 THEN
        DELETE FROM employees WHERE employees.salary = salary;
    ELSEIF salary >= 2000 AND salary < 5000 THEN
        UPDATE employees SET salary = salary + 1000 WHERE employees.salary = salary;
    ELSE
        UPDATE employees SET salary = salary + 500 WHERE employees.salary = salary;
    END IF;
END //
DELIMITER ;

# 调用
CALL test3(17000.00);

2.4.利用when case添加辅助列

利用薪资判断,划分薪资等级,形成辅助列

SELECT
    last_name,
    first_name,
    salary,
    (CASE
        WHEN salary>=10000 THEN '高'
        WHEN salary>=5000 THEN '中'
        WHEN salary>=3000 THEN '低'
        ELSE '补助'
    END) AS 薪资级别
FROM employees

执行如下:

MySQL流程控制结构_MySQL

但是需要注意的是上面添加的辅助列不能直接 用于来筛选,原因是where语句先执行,但是辅助列的sql还没有生成,所以出错,这时候可以把上面的sql当成一个表,再次筛选,筛选薪资级别为中的信息:

SELECT * FROM
(
SELECT
    last_name,
    first_name,
    salary,
    (CASE
        WHEN salary>=10000 THEN '高'
        WHEN salary>=5000 THEN '中'
        WHEN salary>=3000 THEN '低'
        ELSE '补助'
    END) AS 薪资级别
FROM employees
) AS a 
WHERE a.薪资级别='中'

执行如下:

MySQL流程控制结构_批量插入_02

三、循环结构

MySQL中循环分类:

  • while
  • loop
  • continue

循环终止控制:

  • iterate:类似于continue 结束本次循环,继续下次循环
  • leave: 类似于break 结束当前的循环结构

2.1.while

语法:

[label:] WHILE 循环条件
DO
    循环体;
END WHILE [label];

-- label 是自己指定的某个标签名,标签结合iterate或leave控制循环的走向

2.2.loop

语法:

[label:] LOOP 
    循环体;
END LOOP [label];

loop可以用来模拟死循环

2.3 repeat(类似DO{} WHILE() 至少执行一次)

语法:

[label:] REPEAT
    循环体;
UNTIL 结束循环的条件
END REPEAT [label ];

注意:标签主要用在循环控制条件上!!!

2.4.案例

1.实现批量插入,根据输入参数次数来插入到admin表中多条记录

# 1:实现批量插入,根据输入参数次数来插入到admin表中多条记录
DELIMITER //
CREATE PROCEDURE test_while(IN num INT)
BEGIN
    # 定义变量i
    DECLARE i INT DEFAULT 0;
    WHILE i<num DO
        INSERT INTO admin(username,password) VALUES('dzc','000');
        SET i = i+1;
    END WHILE;

END //

DELIMITER ;

//调用
CALL test_while(5)

2.使用leave,实现批量插入。当次数超过5时结束。

DELIMITER //

CREATE PROCEDURE test_while2(IN num INT)
BEGIN
    # 定义变量i
    DECLARE i INT DEFAULT 0;
    a:WHILE i<num DO
        INSERT INTO admin(username,password) VALUES('augus','000');
        SET i = i+1;
        # 判断如果i大于等于5则结束循环,类似于break
        IF i>= 5
            THEN LEAVE a;
        END IF;
    END WHILE a; # 结束语句
END//

DELIMITER ;

# 调用存储过程
CALL test_while2(15)

3.使用iterate,仅仅插入偶数编号的用户和密码

DELIMITER //

CREATE PROCEDURE test_iterate(IN num INT)
BEGIN
    # 定义变量i
    DECLARE i INT DEFAULT 0;
    a:WHILE i<num DO
        SET i = i+1;
        # 判断如果i取余等于0则,
        IF MOD(i,2) <> 0
            THEN ITERATE a;
        END IF;
        
        INSERT INTO admin(username,password) VALUES(CONCAT('augus',i),'000');

    END WHILE a; # 必须要写

END //

DELIMITER ;

//调用
CALL test_iterate(14)

具体解释如下:

  • MOD(i,2):这个函数表示取变量i除以2的余数。
  • IF MOD(i,2) <> 0:这里判断如果i除以2的余数不等于0,即i为奇数时执行下面的操作。
  • ITERATE a;:这个语句的作用是跳过当前循环的剩余部分,继续下一次循环。在这里,如果i为奇数,则会跳过插入记录的操作,直接进入下一次循环