
MySQL全面瓦解20:可编程性之流程控制语句
背景
说到流程控制语句,我们在程序语法中用的比较多,比如C#的if..else...,while...,?: 等。同样的,在MySQL中,也有一些流程控制的语法,方便我们在写函数、存储过程的时候对逻辑进行控制和处理。
常见的过程式SQL语句可以用在存储过程或者函数体中。其中包括:IF函数、IF条件语句、CASE语句、LOOP语句、WHILE语句、REPEAT语句、LEAVE语句和ITERATE语句,它们极大的方便了我们进行流程控制。
下面我们一个一个来看。
流程语句分解
数据基础
IF函数
有点类似C#语法中的三元表达式,有3个参数,第一个参数是表达式,后面两个是值,当表达式成立的时候取第一个值,表达式不成立的时候取第二个值。
输出学生信息中的名称和性别(1为男,0为女,这边用if函数进行转换)
IF条件语句
IF语句用来进行条件判断,根据不同的条件执行不同的操作。该语句在执行时首先判断IF后的条件是否为真,则执行THEN后的语句,如果为假则继续判断IF语句直到为真为止,当以上都不满足时则执行ELSE语句后的内容。
代码示例,根据考试成绩来分布不同的成绩等级
执行结果
CASE语句
CASE语句为多分支语句结构,该语句首先从WHEN后的VALUE中查找与CASE后的VALUE相等的值,如果查找到则执行该分支的内容,否则执行ELSE后的内容。CASE语句表示形式如下,类似C#中switch:
在select中使用示例
在函数或存储过程中使用示例
函数执行结果
循环语句while
循环语句while 类似于C#中的while循环,我们知道在C#的while 或者 for 语句中,经常有用到两个关键语法:跳过当前循环(continue) 和 结束循环(break)。
同样的,在MySQL中也有两个语法对应跳过和结束循环。
while 语法
loop_label:循环标签,和iterate、leave结合用于在循环内部对循环进行控制:如:跳过本次循环、结束循环。
condition:循环条件,当满足条件的时候,就会执行循环体,条件不成立的时候结束循环。
while示例
下面脚本代码演示了将students表中studentid在给定数值范围内的数据存储到另外一张表中。
调用存储过程,给定数值范围是10,所以这边取出1~10的数据存储到studentCount表中
while示例:包含iterate/leave
前面我们说明过了,iterate 和 leave 分别代表跳过本次循环,类似于C#中的continue和break。我们在例子中测试下吧:
遇到studentname=lala时,结束循环,遇到偶数时候跳过单次循环。
调用存储过程,输出符合要求的数据:
循环语句repeat
repeat语法
可以对比下上面while的语法,while是先判断条件是否成立再执行循环体,repeat循环更像是的do...while循环,就是循环始终都会先执行一次,然后再判断结束循环的条件,不满足结束条件,循环体继续执行。
注意条件的变化,下面是调用存储过程,输出需要的数据:
循环语句loop
loop语法
loop不像while和repeat那样有控制条件,条件不符合的时候会跳出。所以它实际上是会一直执行的,如果不主动中断或者跳出的话,类似于一个死循环,需要在循环体中使用iterate或者leave来控制循环的执行。
调用存储过程,并输出你需要的数据:
总结
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,即跳过本次循环。
