1、流程控制
解决复杂问题不可能是通过一个SQL语句完成,我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序,是我们完成复杂操作必不可少的一部分。只要是执行的程序,流程就分为三大类:
1、顺序结构:程序从上往下依次执行
2、分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行。
3、循环结构:程序满足一定条件,重复执行一组语句。
针对MySQL的流程控制语句主要有三类。注意:只能用于存储程序(存储过程和函数)
1、条件判断语句:IF语句和Case语句
2、循环语句:Loop、While、Repeat语句
3、跳转语句:leave、Iterate语句
1.1 分支结构
程序按条件进行选择执行,从两条或多条路径中选择一条执行。
1.1.1 IF(条件判断)
1、语法结构
If 表达式1 Then 操作1; [elseif 表达式2 Then 操作2;]... [else 操作n;] End if;
2、特点
(1)不同的表达式对应不同的操作
(2)使用在Begin…End中
3、案例实操
1.1.2 Case(条件判断)
1、语法结构
#情况1:类似于switch Case 表达式 When 值1 Then 结果1或语句1(如果是语句,需要加分号) When 值2 Then 结果2或语句2(如果是语句,需要加分号) ... Else 结果n或语句n(如果是语句,需要加分号) End [Case] (如果是放在Begin End中需要加上Case,如果放在select后面不需要)
案例实操
#情况二:类似多重if Case when 条件1 Then 结果1或语句1(如果是语句,需要加分号) When 条件2 Then 结果2或语句2(如果是语句,需要加分号) ... Else 结果n或语句n(如果是语句,需要加分号) End [case] (如果是放在Begin...End 中需要加上case,如果放在select后面不需要)
案例实操:
1.2 循环结构
1.2.1 Loop(循环结构、还是个死循环)
Loop循环语句用来重复执行某些语句。Loop内的语句一直重复执行直到循环被退出(使用Leave子句),跳出循环过程。
1、语法结构
循环别名:loop 循环体 循环条件 End Loop 循环别名
2、案例实操(1加到10的和)
1.2.2 While(循环结构)
While语句创建一个带条件判断的循环过程。While在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则就退出循环。
1、语法结构
[while_label:] While 循环条件 Do 循环体 End While[while_label];
说明:while_label为While语句的标注名称;如果循环条件为真,While语句内的语句或语句群被执行,直至循环条件为假,退出循环条件。
2、案例实操(本次实操没有给While循环取别名)
(1加到10的和)
1.2.3 repeat(循环结构)
Repeat语句创建一个带条件判断的循环过程。和While循环不同的是,Repeat循环首先会执行一次循环体,然后在Until中进行表达式的判断,如果满足条件就退出,即End Repeat;如果条件不满足在,则会继续执行循环,直到满足退出条件为止。
1、语法结构
Repeat 循环体 Until 结束循环的条件表达式 end Repeat[repeate_lable];
2、案例实操(1加到10的和)
1.3 跳转语句
1.3.1 Leave语句(和java中break类似)
Leave语句可以用在循环语句中,或这Begin和End包裹起来的程序体内,表示跳出循环或者跳出循环体。
1、语法结构
Leave 标记名;
2、案例实操
看循环结构Loop的实例!!!
1.3.2 Iterate语句(和java中Continue类似)
Iterate语句只能用在循环语句(Loop、While、Repeat语句)内,表示重新开始循环,将执行顺序转到语句段的开头。
1、基本语法
Iterate label;
2、案例实操
mysql> DELIMITER // mysql> CREATE PROCEDURE test_loop1() -> BEGIN -> DECLARE num INT DEFAULT 1; -> DECLARE bSum INT DEFAULT 0; -> LOOP -> SET bSum = bSum + num; -> IF num = 8 THEN -> ITERATE; -> END IF; -> SET num = num + 1; -> IF num > 10 THEN -> LEAVE; -> END IF; -> END LOOP; -> SELECT bSum; -> END // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> CALL test_loop1(); ±-----+ | bSum | ±-----+ | 43 | ±-----+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)
2、游标
2.1 什么是游标
虽然我们也可以通过筛选条件 WHERE 和HAVING,或者是限定返回记录的关键字 LIMIT 返回一条录,
但是,却无法在结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是 随意定位到某一
条记录 ,并对记录的数据进行处理。
这个时候,就可以用到游标。游标,提供了一种灵活的操作方式,让我们能够对结果集中的每一条记录
进行定位,并对指向的记录中的数据进行操作的数据结构。游标让 SQL 这种面向集合的语言有了面向过
程开发的能力。
在 SQL 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标 充当了指针的作用 ,我们可以通过操作游标来对数据行进行操作。
案例实操