欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql 控制结构初识

程序员文章站 2022-10-25 23:35:30
Mysql 流程控制 认识 从我目前所接触的编程语言,C, R, VB, Python, Javascript...,来看, 无非就是 变量, 表达式, 流程控制(顺序, 分支, 循环), 封装了一些更高级的数据结构而已 , 区别在于应用场景和语言特性, 其实逻辑都是相同的, 唯手熟尔. 选择结构 ......

mysql 流程控制

认识

从我目前所接触的编程语言,c, r, vb, python, javascript...,来看, 无非就是变量, 表达式, 流程控制(顺序, 分支, 循环), 封装了一些更高级的数据结构而已, 区别在于应用场景和语言特性, 其实逻辑都是相同的, 唯手熟尔.

选择结构 if-else; case

-- if-esle 语法
if search_condition then 
    statement_list;
[elseif search_condition then
    statement_list; ....]
else
    statement_list;
end if;
-- case 语法
case case_value
    when when_value then statement_list
    [when when_value then statement_list]...
    [else statement_list]
end case;

or:
case
when search_condition then statement_list
[when search_condition then statement_list] ...
[else statement_list]
end case
-- 随机推送一句表白
drop procedure if exists saylove;
delimiter //
create procedure saylove()
begin
    declare num int default 0;
    -- 生成一个1-5间的随机数
    set num := round(rand()*5);
    -- 判断
    case num
        when 1 then select "人生若只如初见";
        when 2 then select "春风十里不如你";
        when 3 then select "爱你就像爱生命";
        else
            select "今晚的月色真美";
    end case;
end //
delimiter ;

call saylove();

-- out
mysql> call saylove();
+----------------+
| 今晚的月色真美 |
+----------------+
| 今晚的月色真美 |
+----------------+
1 row in set (0.09 sec)

query ok, 0 rows affected (0.00 sec)

mysql> call saylove();
+----------------+
| 爱你就像爱生命 |
+----------------+
| 爱你就像爱生命 |
+----------------+
1 row in set (0.14 sec)

query ok, 0 rows affected (0.00 sec)

mysql> call saylove();
+----------------+
| 春风十里不如你 |
+----------------+
| 春风十里不如你 |
+----------------+
1 row in set (0.11 sec)

case 能实现的, if-else也完全能, 只是提供了更多的选择而已.

-- 用 if-esle实现
drop procedure if exists saylove;
delimiter //
create procedure saylove()
begin
    declare num int default 0;
    -- 生成一个1-5间的随机数
    set num := round(rand()*5);
    -- 判断
    if num=1 then select "人生若只如初见";
    elseif num=2 then select "春风十里不如你";
    elseif num-3 then select "爱你就像爱生命";
    else
        select "今晚的月色真美";
    end if;
end //
delimiter ;

call saylove();

mysql 循环

  • while ... do ... end while 叫什么"当"型循环, 满足条件才进入循环体
  • loop ... leave...end loop "直到型循环"
  • repeat ... until ... end repeat

while ...do ...循环

while search_condition do
    statement_list;
end while;

repeat ...until ...循环

repeat
    statement_list;
until search_condition;
end repeat;

loop ...leave 循环

[begin_label:] loop
    statement_list;
    leave [begin_label];
end loop [end_label];

循环-案例 1+2+...n

-- while 实现 求1+2+3+..n和
-- 自己容易混的点: 忘在结尾; end; 变量忘了 set;
-- 传入参数: in 传入值; out: 传入变量去接收返回的值; inout 传入又输出
drop procedure if exists sumn_while;
delimiter //
create procedure sumn_while(in n int)
begin
    declare total int default 0;
    declare i int default 0;
    -- while ...do ....
    while i <= n do
        set total := total + i;
        set i := i + 1;
    -- 打印一下结果
    end while;
    select concat("1+2+..", n, "的和是:", total) as '输出啦';
end //
delimiter ;

call sumn_while(100);

-- out
call sumn_while(100);
query ok, 0 rows affected (0.00 sec)

query ok, 0 rows affected (0.00 sec)

+----------------------+
| 输出啦               |
+----------------------+
| 1+2+..100的和是:5050 |
+----------------------+
1 row in set (0.10 sec)

同样同 repeat ... until ..实现, 顺便练习下 out 类型参数

-- repeat 实现 1+2+..n的和
drop procedure if exists sumn_repeat;
delimiter //
-- 设置传入out型参数变量, 用来接收输出值
create procedure sumn_repeat(out total int)
begin
    xxxx
end //
delimiter ;
drop procedure if exists sumn_repeat;
delimiter //
-- 设置再传入out型参数变量, 用来接收输出值
create procedure sumn_repeat(in n int)
begin
    declare i int default 0;
    declare total int default 0;
    
    -- repeat ... until ...
    repeat
        set total := total + i;
        set i := i + 1;
        -- 退出条件 until..true时才退出哦, 注意跟while的区别
        until i > n
    end repeat;
    -- 在内部打印出结果
    select total;
end //
delimiter ;

-- out
call sumn_repeat(100);
query ok, 0 rows affected (0.00 sec)

query ok, 0 rows affected (0.00 sec)

+-------+
| total |
+-------+
|  5050 |
+-------+
1 row in set (0.09 sec)

用out类型参数.

-- repeat 实现 1+2+..n的和
drop procedure if exists sumn_repeat;
delimiter //
-- 设置再传入out型参数变量, 用来接收输出值
create procedure sumn_repeat(in n int, out total int)
begin
    declare i int default 0;
    
    set total := 0;  -- 顺序: 先decalre 再是set, 不能乱,兄弟
    -- repeat ... until ...
    repeat
        set total := total + i;
        set i := i + 1;
        -- 退出条件 until..注意是条件为true时退出哦
        until i > n
    end repeat;
end //
delimiter ;

-- set @ret := 0;
-- call sumn_repeat(100, @ret);
-- select @ret;

-- out
mysql> set @ret := 0;  -- 这个全局变量 @ret 用来接收过程的 total值哦 
query ok, 0 rows affected (0.00 sec)

mysql> call sumn_repeat(10000, @ret);
query ok, 0 rows affected (0.04 sec)

mysql> select @ret;
+----------+
| @ret     |
+----------+
| 50005000 |
+----------+
1 row in set (0.08 sec)

再用 loop....leave 来整一波

-- loop ...leave ... 来实现 求 1+2+..n 的和
drop procedure if exists sumn_loop;
delimiter //
create procedure sumn_loop(in n int, out total int)
begin
    declare i int default 0;
    set total := 0;
    -- loop, 先取一个标签名, 再写退出条件, if-then...
    myloop: loop
        if i > n then
            leave myloop;
        end if;
        set total := total + i;
        set i := i + 1;
    end loop;
end //
delimiter ;

-- out
mysql> set @ret := 0;
query ok, 0 rows affected (0.00 sec)

mysql> call sumn_loop(100, @ret);
query ok, 0 rows affected (0.00 sec)

mysql> select @ret;
+------+
| @ret |
+------+
| 5050 |
+------+
1 row in set (0.11 sec)

小结mysql控制流

补充: 存储过程的参数声明

  • in 类型: 要求在调用的时候, 接收从外界传入一个值.
  • out 类型: 要求在调用时, 传入一个变量去接收procedure的"返回值"
  • inout 类型: 输入输出型

补充: mysql变量定义

  • 在存储过程内, 用: declare 变量名 类型 [default 值]; 类似"局部变量"
  • 在外边运行, 用: @变量 := 值; 类似"全局变量", 注意mysql的标准赋值符号是 " := ", 而 "=" 只有在update 和set时表示赋值, 其余场景都是 "等号".
  • 选择结构(if, case):
    • if - elseif- esle -end if;
    • case value when value1 then ; when value2 ...then .. else .. . end case;
  • 循环结构(while, repeat, loop)
    • while .... do .... end while;
    • repeat ... until .... end repeat;
    • myloop: loop ..... if ... then leave myloop; end if ; ..... end loop;