4.循环结构
1.while
while循环是有条件的循环控制语句,满足条件后,再执行循环体中的SQL语句,具体语法为:
#先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑 while 条件 do SQL逻辑 end while;
例子n数的总分:
mysql> delimiter $ mysql> create procedure test1(in num int) begin declare sum int default 0; while num>0 do set sum=sum+num; set num=num-1; end while; select sum; end$ mysql> delimiter ; mysql> call test1(10); +------+ | sum | +------+ | 55 | +------+ 1 row in set (0.00 sec)
2.repeat
repeat是条件的循环控制逻辑,先循环一次,然后判定逻辑是否满足,如果满足则退出,如果不满足,则进行下一次循环
repeat SQL逻辑 until 条件 end repeat;
例子n数的总分:
mysql> delimiter $ mysql> create procedure test2(in num int) begin declare sum int default 0; repeat set sum=sum+num; set num=num-1; until num<=0 end repeat; select sum; end$ mysql> delimiter ; mysql> call test2(10); +------+ | sum | +------+ | 55 | +------+ 1 row in set (0.00 sec)
3.loop
loop实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其实现简单的死循环。loop可以配合一下两个语句使用:
- leave:配合循环使用,退出循环。
- iterate:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。
循环名:loop SQL逻辑 leave 循环名 iterate 循环名 end loop 循环名;
例子求0-n的偶数之和
create procedure test3 (in num int) begin declare sum int default 0; test3:loop if num<=0 then leave test3; end if; if num%2=0 then set sum=sum+num; end if; set num=num-1; end loop test3; select sum; end; call test3(100);
5.游标
游标是用来存储查询结构集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明,open,fetch和close,其语法分别如下:
1.声明游标
declare 游标名称 cursor for 查询语句;
2.打开游标
open 游标名称;
3.获取游标记录
fetch 游标名称 into 变量[,变量];
4.关闭游标
close 游标名称;
6.条件处理程序
条件处理程序可以用来定义在流程控制结构执行过程中遇到问题时响应的处理步骤。具体语法为:
declare handler_action handler for condition_value [,condition_value] statement; handler_action: continue:继续执行当前程序 exit:终止执行当前程序 condition_value: sqlstate sqlstate_value:状态码,如02000; sqlwarning:所有以01开头的sqlstate代码的简写 not found:所有以02开头的sqlstate代码的简写 sqlexception:所有没有被sqlwarning或not found捕获的sqlstate代码的简写
例子:解决游标循环插入表列的情况
5.存储函数
存储函数是有返回值的存储过程,存储函数的参数只能是in(输入)类型的。具体语法如下:
create function 存储函数名称([存储列表]) returns type [characteristic] begin --SQL语句 return ...; end; characteristic说明: deterministic:相同的输入参数总是产生相同的结果 no sql:不包含SQL语言 reads sql data:包含读取数据的语句,但不包含写入数据的语句
6.触发器
1.介绍
触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句合集。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名old和now来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发还只是支持行级触发,不支持语句级别触发。
2.语法
1.创建
create trigger trigger_name before/after insert/update/delete on tbl_name for each row --行级触发器 begin trigger_stmt; end; before:在操作之前触发 after:操作之后触发 insert/update/delete:操作类型
2.查看当前数据库的触发器
show triggers;
3.删除
drop trigger [schema_name.]trigger_name; --如果没有指定schema_name,默认为当前数据库
例子:
7.总结
1.视图(view)
虚拟存在的表,不保存查询结果,只保存查询的SQL逻辑
简单,安全,数据独立
2.存储过程(procedure)
事先定义并存储在数据库中的一段SQL语句的集合。
减少网络交互,提高性能,封装重用
变量,if,case,参数(in/out/inout),while,repeat,loop,cursor,handler
3.存储函数(function)
存储函数是有返回值的存储过程,参数类型只能为in类型
存储函数可以被存储过程替代
4.触发器(trigger)
可以在表数据进行insert,update,delete之前或之后触发
3.删除
drop trigger [schema_name.]trigger_name; --如果没有指定schema_name,默认为当前数据库
例子:
7.总结
1.视图(view)
虚拟存在的表,不保存查询结果,只保存查询的SQL逻辑
简单,安全,数据独立
2.存储过程(procedure)
事先定义并存储在数据库中的一段SQL语句的集合。
减少网络交互,提高性能,封装重用
变量,if,case,参数(in/out/inout),while,repeat,loop,cursor,handler
3.存储函数(function)
存储函数是有返回值的存储过程,参数类型只能为in类型
存储函数可以被存储过程替代
4.触发器(trigger)
可以在表数据进行insert,update,delete之前或之后触发
保证数据完整性,日志记录,数据校验