当前位置 博文首页 > 翁智华:MySQL全面瓦解20:可编程性之流程控制语句

    翁智华:MySQL全面瓦解20:可编程性之流程控制语句

    作者:翁智华 时间:2021-01-30 18:45

    背景

    说到流程控制语句,我们在程序语法中用的比较多,比如C#的if..else...,while...,?: 等。同样的,在MySQL中,也有一些流程控制的语法,方便我们在写函数、存储过程的时候对逻辑进行控制和处理。

    常见的过程式SQL语句可以用在存储过程或者函数体中。其中包括:IF函数、IF条件语句、CASE语句、LOOP语句、WHILE语句、REPEAT语句、LEAVE语句和ITERATE语句,它们极大的方便了我们进行流程控制。

    下面我们一个一个来看。

    流程语句分解

    数据基础

     1 mysql> select *  from students;
     2 +-----------+-------------+-------+---------+-----+
     3 | studentid | studentname | score | classid | sex |
     4 +-----------+-------------+-------+---------+-----+
     5 |         1 | brand       | 105.5 |       1 |   1 |
     6 |         2 | helen       | 98.5  |       1 |   0 |
     7 |         3 | lyn         | 97    |       1 |   0 |
     8 |         4 | sol         | 97    |       1 |   1 |
     9 |         5 | b1          | 89    |       2 |   1 |
    10 |         6 | b2          | 90    |       2 |   1 |
    11 |         7 | c1          | 76    |       3 |   0 |
    12 |         8 | c2          | 73.5  |       3 |   0 |
    13 |         9 | lala        | 73    |       0 |   0 |
    14 |        10 | A           | 100   |       3 |   1 |
    15 |        16 | test1       | 100   |       0 |   1 |
    16 |        17 | trigger2    | 107   |       0 |   1 |
    17 |        22 | trigger1    | 100   |       0 |   0 |
    18 +-----------+-------------+-------+---------+-----+
    19 13 rows in set
    20 
    21 mysql> select *  from scores;
    22 +-----------+---------+-------+
    23 | scoregrad | downset | upset |
    24 +-----------+---------+-------+
    25 | A         |      81 |    90 |
    26 | B         |      71 |    80 |
    27 | C         |      61 |    70 |
    28 | D         |      51 |    60 |
    29 | S         |      91 |   100 |
    30 | S+        |     101 |   120 |
    31 +-----------+---------+-------+
    32 6 rows in set 

    IF函数

    有点类似C#语法中的三元表达式,有3个参数,第一个参数是表达式,后面两个是值,当表达式成立的时候取第一个值,表达式不成立的时候取第二个值。

    1 if(expr,val1,val2);   --语法 

    输出学生信息中的名称和性别(1为男,0为女,这边用if函数进行转换)

     1 mysql> select studentname,if(sex=0,'','') from students where classid<>0;
     2 +-------------+---------------------+
     3 | studentname | if(sex=0,'','') |
     4 +-------------+---------------------+
     5 | brand       ||
     6 | helen       ||
     7 | lyn         ||
     8 | sol         ||
     9 | b1          ||
    10 | b2          ||
    11 | c1          ||
    12 | c2          ||
    13 | A           ||
    14 +-------------+---------------------+
    15 9 rows in set 

    IF条件语句

    IF语句用来进行条件判断,根据不同的条件执行不同的操作。该语句在执行时首先判断IF后的条件是否为真,则执行THEN后的语句,如果为假则继续判断IF语句直到为真为止,当以上都不满足时则执行ELSE语句后的内容。

    1 IF condition THEN
    2     ...
    3 ELSEIF condition THEN
    4     ...
    5 ELSE
    6     ...
    7 END IF 

    代码示例,根据考试成绩来分布不同的成绩等级

     1 mysql> 
     2 /*如果存在函数func_test2,则删除*/
     3 DROP FUNCTION IF EXISTS fun_if;
     4 /*声明结束符为$*/
     5 DELIMITER $
     6 /*创建函数*/
     7 CREATE FUNCTION fun_if(score DECIMAL(10,2))
     8   RETURNS CHAR
     9 BEGIN
    10 DECLARE score_grad VARCHAR(5) DEFAULT '';
    11 IF score>100 THEN SET score_grad='S'; 
    12 ELSEIF (score BETWEEN 91 AND 100) THEN SET score_grad='A';
    13 ELSEIF (score BETWEEN 81 AND 90) THEN SET score_grad='B';
    14 ELSEIF (score BETWEEN 71 AND 80) THEN SET score_grad='C' ;
    15 ELSE set score_grad='D';
    16 END IF;
    17 return score_grad;
    18 END $
    19 /*重置结束符为;*/
    20 DELIMITER ;
    21 Query OK, 0 rows affected 

    执行结果

    1 mysql> select fun_if(101),fun_if(100),fun_if(90),fun_if(80),fun_if(70);
    2 +-------------+-------------+------------+------------+------------+
    3 | fun_if(101) | fun_if(100) | fun_if(90) | fun_if(80) | fun_if(70) |
    4 +-------------+-------------+------------+------------+------------+
    5 | S           | A           | B          | C          | D          |
    6 +-------------+-------------+------------+------------+------------+
    7 1 row in set