MYSQL必备控制流程

流程控制的概念

数据库中的流程控制也就相当于C语言中的流程控制语句,其中有又分为顺>序结构、选择结构和循环结构三种分支结构。
顺序结构
选择结构
循环结构
通常这些结构都与存储过程和函数配合使用

顺序结构

从上往下顺序执行代码

begin end 语句

相当于C语言中的括号 {}。C语言中的{}可以嵌套,如{ { } },begin end也是可以嵌套的
每一个begin end 相当于一个语句块,用select 语句可以充当打印语句
定义变量 declare 变量名 类型 默认值
定义局部变量 set @变量名=表达式
使用 select 进行查询替代打印语句
例:

begin
    declare x int;      ## 定义了一个int类型的变量
    set x = 10;         #给变量x设置值为10
    #语句块的嵌套
    begin
        declare y int;
        set y = x;
        select x;
    end
    select x;
    select y;  #select y; 这里可以使用变量y么?
end

变量赋值

定义一个变量
SET语句
定义用户变量,

#定义局部会话变量
set @变量名               #只对当前用户使用的客户端生效##定义一个全局变量
set global @@变量名       #对所有客户端生效,服务器重启后失效#变量名赋值操作,类型会被自动的进行识别
set 变量名=数据           #修改变量名的数据

declare语句
专门用于定义局部变量

declare 变量名 类型名

select into
使用select into语句为变量赋值

select 列字段名 into 变量名

选择结构

if分支结构
if语句
基本格式:
if 判断条件 then 语句;
end if(注意结束需要用end if)

#分支语句
if (表达式)  then
    ##执行语句
    ##执行语句2
    ##执行语句。。。
end if;

if else语句
基本格式:

if 判断条件 then 
    #语句1;
else 
    #语句2;
end if;

if else嵌套
if语句之后的判断条件可以用()改变条件的优先级。
多重条件语句
基本格式:

 if 判断条件1 then 
    ## 语句1;
 elseif 判断条件2 then 
    ## 语句2;
 else
    ## 语句3
 end if;

例如:

delimiter $$
​
create procedure test1(in x int)
begin
    if x>100 then 
        select '大于100';
    elseif 100=x then 
        select '等于100';
    else 
        select '小于100';
    end if;
end;
call test1();
delimiter ;

条件语句case
MySQL中的条件语句相当于C语言中的switch case语句。
基本格式:

case 条件值 
    when1 then 语句1;
    when2 then 语句2;
    #...
    when 值n then 语句n;
    else 语句n+1;
end case;

使用例子

##开关语句
##score int 
case score
    when 10 then select 'A';
    when 20 then select 'B';
    when 30 then select 'C';
    else select 'D';
end case;

例如:对成绩进行评分

create procedure test2(in score int)
begin
    case score/10
        when 10
        when 9 then select '优秀';
        when 8 then select '良好';
        when 7
        when 6 then select '及格';
        else select '不及格';
    end case;
end;

循环结构

在C语言中有三种循环结构:for、while和do while。
那么在MySQL语言中也有相应的语句。
while循环语句
基本格式:

#while循环
while 条件表达式 do
    #循环体语句;
end while;

数据库中的while循环和C语言中的while几乎一样
例如:求数字1到10的和

create procedure test3(out sum int)
begin
    declare i int default 1;
    declare s int default 0;
    while i<=10 do
        set s = s+i;
        set i = i+1;
    end while;
    set sum = s;
end;call test3(@s);
select @s;

loop循环
基本格式:

#loop循环
标识符: loop
#代码块
end loop;

注意:这里的loop循环是一个无限循环,其没有结束条件,所以需要手动添加结束条件。
给loop循环添加结束条件

#有结束条件的循环
标识符: loop 
    #循环体语句;
    if 条件表达式 then
        leave 标识符;      #跳出循环
    end if;
end loop;

这里给循环取别名,通过if语句判断结束条件,leave离开跳出循环(相当于C语言中的break)。
例如:求数字1到n之和

create procedure test4(out sum int,in n int)
begin
    declare s int default 0;
    declare i int default 1;
    sum:loop
        set s=s+i;      
        set i=i+1;
        if i>n then leave sum;
        end if;
    end loop;
    set sum = s;
end;

repeat循环
repeat循环是条件表达式为真时才跳出循环
基本格式

repeat 
循环体语句;
#执行语句块
until 条件表达式
end repeat;

注意:repeat循环相当于C语言中的do while循环,都是先执行一次循环体再进行条件判断,但是不同的是,do while循环是条件不满足时才结束循环,而repeat是条件满足时才结束循环。并且until语句后不能有';'分号.
例如:求数字n到m之和

create procedure test5(out sum int,in n int,in m int)
begin
    declare i int default n;
    declare j int default n+1;
    repeat  set i = i+j;    set j = j+1;
    until j>m
    end repeat;
set sum = i;
end;
call test5(@s,5,10);
select @s;

跳出循环
leave 语句
跳出并结束整个循环,相当于C语言中的break语句。
iterate
跳出并结束当本次循环,进入下次循环,相当于C语言中的continue。
注意:iterate只能在循环中使用。
在mysql语句中的跳出语句,都需要在循环语句中,写上跳出的标识符
注意:以上所说的流程控制是相对于存储过程而言的,流程控制大多是用于配合存储过程的,因为自定义函数在数据库中使用比较少,大多数都是使用存储过程。
havaing语句
变量是无法直接用where进行条件判断,例如用function返回的数据起上一个别名以后

select fn(t_id) as a from [table] having a=12;

总结

流程语句的过程
变量的定义和赋值操作
用select充当打印语句
顺序结构,选择结构,循环语句
存储过程定义语句
函数定义数据算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章