当前位置 博文首页 > 翁智华:MySQL全面瓦解20:可编程性之流程控制语句
说到流程控制语句,我们在程序语法中用的比较多,比如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
有点类似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后的条件是否为真,则执行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