什么是数据库中的流程控制
目录
流程控制的基本概念
一、顺序结构:
1、begin...end 嵌套
二、局部变量的定义和使用
1、局部变量的定义
2、变量的赋值
3、数据库变量
1、局部变量
2、局部变量的赋值和使用
3、用户变量
4、会话变量和全局变量
三、选择结构:
if 分支选择结构
case多分支结构
while循环结构
loop循环结构:
repeat循环
跳转语句
流程控制的基本概念
数据库中的流程控制也就相当于C语言中的控制语句,其中又分为顺序结构,选择结构和循环结构三种。
C语言中的控制结构:
顺序结构:(....)
选择结构:if()...else.....、switch()....case....
循环结构:for()、while()、do....while()
#在数据库中、流程控制通常与存储过程和函数配合使用
一、顺序结构:
mysql woekbench中sql语句的执行顺序:从上往下,从左至右顺序执行SQL语句。
顺序结构中复合语句的关键字:begin....end;
-- begin.....end 相当于C语言中的大括号(....).
C语言中的{}可以嵌套,如{{}}。
同理,begin end 也是可以嵌套的。
每一个begin end相当于一个复合语句(语句块)
1、begin...end 嵌套
例如:
Begin
declare x int;#定义了一个Int类型的变量x
set x = 10; #给变量x设置值为10
begin
declare y int; #定义了一个Int类型的变量y
set y =x; 将x的值赋给y
select x;select y;
end
select x;
end
复合语句(语句块):begin....end
-- 相当于c/c++中的{....}
begin
select "abc";
select 123;
-- insert
begin
-- select
-- delete
end;
end//
delimiter;
-- sql 语句中的流程控制语句只能在存储过程、函数等数据库对象中使用,全局下无法使用
二、局部变量的定义和使用
1、局部变量的定义
声明定义关键字:declare
设置初始值关键字:default
基本格式:declare 变量名 数据类型[default 初始值]
例如:declare a int default 0;
#定义了一个变量a ,初始化赋值为0
2、变量的赋值
set 变量名 = 变量值;
局部变量的生命周期:当前复合语句,局部范围有效
局部变量的作用域:其定义的复合语句中,只能在begin....end中使用。
3、数据库变量
1、局部变量
-- 局部变量的定义和初始化
-- 定义局部变量的基本格式
declare 变量名 数据类型[default 初始值];
2、局部变量的赋值和使用
-- 变量的赋值:
set 变量名 = 变量值;
--局部变量就是局部范围内有效的变量,不能在全局下定义和使用
--局部变量只能在复合语句begin...end中使用
delimiter //
begin
declare n int default 10;
set n=100;
declare m varchar(20);
set m ="abcdefg";
declare x date default now();
end//
delimiter ;
3、用户变量
-- 用户变量的生命周期;当前连接
-- 用户变量的作用域:当前连接有效,默认为Null值。
-- 用户变量的定义和使用:
set@变量名 = 变量值;
例如:
set @x =10;
set @y =20;
set @sum =@x+@y;
select @x;
select @sum;
-- 用户变量
-- 基本格式:@变量名
-- 变量的赋值:set @变量名 = 变量值;
-- 用户变量的作用域和生命周期为当前连接,是当前连接有效的变量,相当于C/C++中的全局变量
-- 用户变量不需要定义,也不需要给定数据类型,默认值为null
-- 用户变量是一种弱类型的变量,万用类型,给它赋值什么类型它就存储什么类型
-- 当前连接:使用用户名和密码登陆数据库服务,称为一次连接
-- 重新连接或重新登陆会建立一个新的连接,新链接不共享用户变量
set @a = 100;
select @a;
select @b;
set @a = "abc";
select @a;
set @a = 123.456;
select @a;
4、会话变量和全局变量
会话变量:
系统自带的,是用来保存数据库当前会话的默认数据,当前连接有效,
重新连接会恢复默认值,一般格式;@@会话变量名
查看会话变量:
show session variables;
-- 会话变量session
-- 基本格式:@@会话变量名
-- 会话变量无法人为定义
-- 会话变量是数据库系统自带的,用于保存数据库当前连接的默认设置选项,重新连接后还原
-- 查看当前连接的会话变量
show session variables;
全局变量:
系统自带的,是用来保存数据库当前服务的默认数据,当前服务有效,重启服务后恢复默认值,一般格式:@@全局变量名
查看全局变量: show global variables;
-- 全局变量global
-- 基本格式:@@全局变量名
-- 全局变量无法人为定义
-- 全局变量是数据库系统自带的,用于保存数据库当前服务的默认设置选项,重启服务后还原
查看当前服务的全局变量
show session variables;
三、选择结构:
if 分支选择结构
1、if语句的基本格式: if<判断条件> then <语句> end if; (注意结束If需要用end if) 2、if else 语句的基本格式 if<判断条件> then <语句1> else <语句2;> end if; 3、if else嵌套的基本格式: if<判断条件> then<语句;>else if<判断条件2> then<语句2;> [elseif...then...;] [else语句n;]end if;
-- if 分支
例如:求两个数中的最大值
delimiter//
create procedure maxs(in x float,in y float)
begin
if x>y then select x;
elseif x<y then select y ;
else select"相等";
end if;
end//
delimiter ;
call maxs(11,22);
call maxs(123,99);
call maxs(10,10);
case多分支结构
基本格式: case 条件值 when 值1 then 语句1; when 值2 then 语句2; .... when 值n then 语句n; else 语句n+1;#相当于default end case; 相当于C语言中的switch case 语句。
-- case 多分支结构
-- 例如:给成绩(0到100)评定等级(优秀,良好,及格,不及格)
delimiter//
create procedure scores(in score float)
begin
case score div 10
when 9 then select"优秀" as "成绩等级";
when 8 then select"优秀" as "成绩等级";
when 7 then select"良好" as "成绩等级";
else select"不及格" as "成绩等级";
end//
delimiter ;
call scores(100);
call scores(98);
select 95/10; -- 整数除整数,如果不能整除结果为小数
select 95 div 10; -- div为整除符号
select floor(95/10) -- floor 为取整函数
-- sql语言中的流程控制语句都要以对应的end 语句结束
while循环结构
在c语言中有三种循环结构:for 、where和do where。
那么在sql语言中也有相应的语句。
while....do 循环结构
while循环基本格式:
while条件表达式
do 循环体语句;
end while;
#数据库中的while循环和C语言中的while一样
1、while...do 循环
-- 例如:循环求整数1到100的和
delimiter//
create procedure SUM1(out sums float) -- out :传出类型参数
begin
declare sum int default 0;
declare i int default 1;
while i<=100
do
set sum = sum+i;
set i = i+1;
end while;
-- select sum;
set sums =sum;
end//
delimiter;
call SUM1(@sum);-- 使用用户变量来接收传出类型参数的值
loop循环结构:
1、loop循环结构:
loop 循环体语句;
end loop ;
#注意:这里的loop循环是一个无限循环,其没有结束条件,所以需要手动添加结束条件。
2、给loop循环添加结束条件
循环别名:loop 循环体语句;
if 条件表达式 then leave 循环别名; end if;
end loop;
#这里给循环取别名,通过if语句判断结束条件,leave离开跳出循环(相当于C语言中的break).
-- loop 循环
例如:求整数1到n的和(n通过参数传递)
delimiter//
create procedure SUM2(in n int ,out sums float) -- Out:传出类型参数
begin
declare sum int default 0;
declare i int default 1;
S:loop -- S:给loop循环取一个别名为S
set sum = sum +i;
set i =i +1;
if i>n then leave S; -- 条件为真则离开循环(leave 相当于C/C ++中的break)
end if;
end loop;
set sums = sum;
end//
delimite ;
repeat循环结构基本格式:
repeat 循环体语句;
until 条件表达式
end repeat ;
#注意:repeat循环相当于C语言中的do while 循环,都是先执行一次循环体再进行条件判断,但是不同的###是,do while循环是条件不满足时才结束循环,而repeat是条件满足时才结束循环,并且until子句后不能有分号;
repeat循环
-- 例如:求整数n到m的和
delimiter//
create procedure SUM3(inout n int ,out int m int ) -- inOut:即可传入又可传出类型参数
begin
declare sum int default 0;
declare i int default ;
repeat
set sum = sum +i;
set i =i +1;
until i>m end repeat; -- 直到满足条件时才会结束循环
set n = sum;
end//
delimiter ;
跳转语句
1、leave
跳出并结束整个循环,相当于C语言中的break.
2、iterate
跳出并结束当前本次循环,进入下次循环,相当于C语言中的continue.
#注意:iterate 只能在循环中使用
#以上所说的流程控制是相对于存储过程而言的,流程控制大多是用于配合存储过程的,因为自定义
#函数在数据库中使用比较少,大多数都是使用存储过程的。
-- 跳转语句
-- leave :跳出并结束整个循环,相当于C/C++ 中的break
-- iterate: 跳出本次循环,继续执行下次循环,相当于C/C++ 中的continue