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

MySQL全面瓦解20:可编程性之流程控制语句,第1张

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

说到流程控制语句,我们在程序语法中用的比较多,比如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 |       |    6 2 | helen       98.5  0  7 3 | lyn         97     8 4 | sol          9 5 | b1          89    10 6 | b2          90    11 7 | c1          76    12 8 | c2          73.5  13 9 | lala        73    14 |        10 | A           100   15 16 | test1       16 17 | trigger2    107   17 22 | trigger1    18 19 13 rows in set20 21 MysqL 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 set 
IF函数

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

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

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

select studentname,if(sex=0,'',1)">男') from students where classID<>0;-----------+---------------------+| ') ||9 rows set 
IF条件语句

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

IF condition THEN2     ...3 ELSEIF condition 4 5 ELSE6 7 END IF 

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

>  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 BEGIN10 DECLARE score_grad VARCHAR(5) DEFAulT ''11 IF score>100 THEN SET score_grad=S'; 12 ELSEIF (score BETWEEN AND 100) A13 ELSEIF (score 90) B14 ELSEIF (score 80) C ;15 ELSE set score_gradD16 IF17 return score_grad;18 END $19 重置结束符为;20 DEliMITER ;21 query OK,1); Font-weight: bold">0 rows affected 

执行结果

1 MysqLselect fun_if(101),fun_if(100),1); Font-weight: bold">90),1); Font-weight: bold">80),1); Font-weight: bold">70);2 -----------+-------------+------------+------------+------------+3 | fun_if(101) 100) 90) 80) 70) 4 5 | S           | B          | C          | D          6 7 1 row set 
CASE语句

CASE语句为多分支语句结构,该语句首先从WHEN后的VALUE中查找与CASE后的VALUE相等的值,如果查找到则执行该分支的内容,否则执行ELSE后的内容。CASE语句表示形式如下,类似C#中switch:

1 CASE exprWHEN val1 THEN result1 or state1[;](可选项,如果是语句需要加分号,结果值可以加)3 WHEN val2 THEN result2 or state2...ELSE resultn  statenEND [CASE] (可选项,在begin end之间需加case,select后就不需要) 

在select中使用示例

case sex WHEN 0 THEN ' 1 end as sex-----------+-----+||set 

在函数或存储过程中使用示例

 fun_case;FUNCTION fun_case(sex INT) 8 20DECLARE sexStr 20) 11  sex 12 then set sexStr13 14 不确定 sexStr;0 rows affected 

函数执行结果

-----------+---------------+| fun_case(sex) ||set 
循环语句while

循环语句while 类似于C#中的while循环,我们知道在C#的while 或者 for 语句中,经常有用到两个关键语法:跳过当前循环(continue) 和 结束循环(break)。

同样的,在MysqL中也有两个语法对应跳过和结束循环。

1  IteraTE  loop_label;   跳过当前循环
1 LEAVE  loop_label;   结束循环
while 语法
loop_label:while condition do2  Todo:loop bodywhile loop_label]

loop_label:循环标签iterateleave结合用于在循环内部对循环进行控制:如:跳过本次循环、结束循环。

condition:循环条件,当满足条件的时候,就会执行循环体,条件不成立的时候结束循环。

while示例

下面脚本代码演示了将students表中studentID在给定数值范围内的数据存储到另外一张表中。

 1 先清除studentCount表记录truncate table studentcount;存储过程如果存在则删除PROCEDURE  sp_while1;创建存储过程PROCEDURE sp_while1(varial_count int 9   10     DECLARE IDx int DEFAulT 111     DECLARE uname 30) 12     loop_label:WHILE IDx<=varial_count DO13       select studentname into uname where studentID = IDx;14       INSERT into studentCount values (IDx,uname);15       SET IDx=IDx+16     WHILE17   结束符置为;19 DEliMITER ; 

调用存储过程,给定数值范围是10,所以这边取出1~10的数据存储到studentCount表中

> CALL sp_while1(10 2 query OK,1)"> row affected 3  4 MysqL*  studentCount;---------+-------------+10 rows set 
while示例:包含iterate/leave

前面我们说明过了,iterate 和 leave 分别代表跳过本次循环,类似于C#中的continue和break。我们在例子中测试下吧:

遇到studentname=lala时,结束循环,遇到偶数时候跳过单次循环。

 sp_while2;PROCEDURE sp_while2(varial_count varial_count DO      如果遇到studentname为lala的同学,结束循环16       IF unamelala        LEAVE loop_label;18       如果IDx为偶数,则跳过本次循环19       ELSEIF IDx%2        IteraTE loop_label;21       ;      22       23     24   25 26 DEliMITER ; 

调用存储过程,输出符合要求的数据:

> CALL sp_while2(4 rows set
循环语句repeatrepeat语法
repeat Todo loop bodyuntil condition end repeat ]

可以对比下上面while的语法,while是先判断条件是否成立再执行循环体,repeat循环更像是的do...while循环,就是循环始终都会先执行一次,然后再判断结束循环的条件,不满足结束条件,循环体继续执行。

 sp_repeat;PROCEDURE sp_repeat(varial_count     loop_label:REPEAT      23     UNTIL IDx>varial_count   24      REPEAT;25   26 27 DEliMITER ; 

注意条件的变化,下面是调用存储过程,输出需要的数据:

> CALL sp_repeat(set 
循环语句looploop语法
loopTodo loop bodyend loop loop label]

loop不像while和repeat那样有控制条件,条件不符合的时候会跳出。所以它实际上是会一直执行的,如果不主动中断或者跳出的话,类似于一个死循环,需要在循环体中使用iterate或者leave来控制循环的执行。

 sp_loop;PROCEDURE sp_loop(varial_count     loop_label:LOOP      16       IF uname='lala' THEN19       ELSEIF IDx%2<>0 THEN21       /*这边加一个终结计数跳出的条件*/22       ELSEIF IDx>varial_count THEN23 24       25       26       27      LOOP;28   29 30 DEliMITER ; 

调用存储过程,并输出你需要的数据:

 1 MysqL> CALL sp_loop(6);3 rows set
总结

1、了解了IF函数,它常用在SELECT语句中,类似于C#中的三元表达式。
2、IF条件表达式,类似于C#中的IF... ELSE...,多用于函数或存储过程中的判断选择逻辑。
3、了解CASE语句的两种用法,一种用在SELECT中使用,一种用在函数和存储过程中。
4、了解了三种循环体的使用,while、repeat分别对应C#中的while 和 do while循环,loop类似于一个while(true)的死循环。
5、循环体都包含在begin end中,循环体的控制依靠leave和iterate,leave相当于break,即退出整个循环体,iterate类似于continue,即跳过本次循环。

总结

以上是内存溢出为你收集整理的MySQL全面瓦解20:可编程性之流程控制语句全部内容,希望文章能够帮你解决MySQL全面瓦解20:可编程性之流程控制语句所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1151525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存