讲述MySQL中的条件控制(if和case)与循环的分类和控制。

条件控制(if和case)

if条件

IF语句包含多个条件判断,根据结果为TRUE、FALSE执行语句,与编程语言中的if、else if、else语法类似,其语法格式如下:

if search_condition_1 then statement_list_1
    [elseif search_condition_2 then statement_list_2] 
    ...
    [else statement_list_n]
end if
  • 如果search_condition_1成立,那么执行statement_list_1
  • 如果search_condition_1不成立,有elseifsearch_condition_2成立,那么执行statement_list_2
  • 如果search_condition_1不成立,elseif后的条件也不成立,有else的话,则直接执行statement_list_n,相当于默认值。
-- ---------IF判断---------
-- 案例1:输入学生的成绩,来判断成绩的级别
/*
        score<60 :不及格
        score>=60且score<80:及格
        score>=80且score<90:良好
        score>=90且score<=100:优秀
        score>100:成绩错误
*/
delimiter $$
create procedure proc12_if(in score int)
begin
    if score<60 
     then 
       SELECT "不及格";
  elseif score>=60 and score<80
     then
       SELECT '及格' ;
  elseif score>=80 and score<90
     then
       SELECT '良好' ;
  elseif score>=90 and score<=100
     then
       SELECT '优秀' ;        
    else
         SELECT '成绩错误' ;    
    end if;
end $$

delimiter ;

set @score = 55;
call proc12_if(@score);
call proc12_if(100);
-- 输入员工的名字,判断工资的情况。
/*
    薪资<10000,试用薪资
        10000(含)~20000:转正薪资
        大于20000(含):元老薪资
*/
delimiter $$
create procedure proc13_if(in in_ename varchar(50))
begin
    declare result varchar(20);     -- 局部变量,存储结果
    declare var_sal decimal(7,2);   -- 局部变量,存储薪资数
        select sal into  var_sal from emp where ename = in_ename;
    if var_sal < 10000 
        then set result = '试用薪资';
    elseif var_sal < 20000
        then set result = '转正薪资';
    else 
        set result = '元老薪资';
    end if;
    select result;  -- 输出结果
end$$
delimiter ;
call proc13_if('庞统');

case条件

CASE是另一个条件判断的语句,类似于编程语言中的switch语法。


-- 语法一(类比java的switch):
case case_value
    when when_value then statement_list
    [when when_value then statement_list] ...
    [else statement_list]
end case
-- 格式1
/*
case case_value
    when when_value then statement_list
    [when when_value then statement_list] ...
    [else statement_list]
end case
*/
/*
    支付方式:
    1  微信支付
    2  支付宝支付
    3  银行卡支付
    4、5、6...  其他方式支付
*/
delimiter $$
CREATE PROCEDURE proc14_case(in paytype int)
begin
  case paytype
      when 1  then  SELECT '微信支付';
        when 2  then  SELECT '支付宝支付';
        when 3  then  SELECT '银行卡支付';
        else SELECT '其他方式支付';
    end case;
end$$
delimiter ;
call proc14_case(1);
call proc14_case(5);  -- 其他方式支付

-- 语法二:
case
    when search_condition then statement_list
    [when search_condition then statement_list] ...
    [else statement_list]
end case
--  -----case------语法二-------
/*
case
    when search_condition then statement_list
    [when search_condition then statement_list] ...
    [else statement_list]
end case
*/

/*
        score<60 :不及格
        score>=60且score<80:及格
        score>=80且score<90:良好
        score>=90且score<=100:优秀
        score>100:成绩错误
*/
delimiter $$
create procedure proc15_case(in score int)
begin
  case
    when score<60 
      then 
        SELECT "不及格";
  when score>=60 and score<80
     then
       SELECT '及格' ;
  when score>=80 and score<90
     then
       SELECT '良好' ;
  when score>=90 and score<=100
     then
       SELECT '优秀' ;        
    else
         SELECT '成绩错误' ;    
    end case;
end $$
delimiter ;
call proc15_case(88);
call proc15_case(98);

循环语句(while、repeat、loop)

  • 循环是一段在程序中只出现一次,但可能会连续运行多次的代码。

  • 循环中的代码会运行特定的次数,或者是运行到特定条件成立时结束循环

循环分类:

  • while

  • repeat

  • loop

循环控制:

  • leave 类似于 break,跳出,结束当前所在的循环

  • iterate类似于 continue,继续,结束本次循环,继续下一次

while循环

语法:

[标签:]while 循环条件 do
    循环体;
end while [标签];

示例:

--   ---------WHILE循环--------
/*
【标签:】while 循环条件 do
    循环体;
end while【 标签】;
*/
-- 案例1:向表中添加10条数据
-- 创建测试表:
use mydb7_procedure;
create table user(
    uid int ,
    username varchar ( 50 ),
    password varchar ( 50 )
);
-- 添加数据:
delimiter $$
create procedure proc16_while1(in insertcount int)
begin
    declare i int default 1;       --  循环变化的变量i,定义局部变量

    label:while i<=insertcount do
        insert into user(uid,username,`password`) values(i,concat('user-',i),'123456');
        set i = i + 1;
    end while label;
        #标签是可以省略的
end $$
delimiter ;
call proc16_while1(10);
-- 结果
-- 1    user-1  123456
-- 2    user-2  123456
-- 3    user-3  123456
-- 4    user-4  123456
-- 5    user-5  123456
-- 6    user-6  123456
-- 7    user-7  123456
-- 8    user-8  123456
-- 9    user-9  123456
-- 10   user-10 123456

将上面的表清空,在while中加入循环控制语句leave:

-- ---------WHILE + leave ----------
truncate table user;
--  使用while + leave,控制其输入的参数大于5时,只插入五条信息
-- 当有leave时,label是必须的
delimiter $$
create procedure proc16_while2(in insertcount int)
begin
    declare i int default 1;       --  循环变化的变量i,定义局部变量
    mylabel:while i<=insertcount do
        insert into user(uid,username,`password`) values(i,concat('user-',i),'123456');
                if i = 5 then
                   leave mylabel;
              end if;
        set i = i + 1;
    end while mylabel;
end $$
delimiter ;
call proc16_while2(10);
-- 运行结果:
-- 1    user-1  123456
-- 2    user-2  123456
-- 3    user-3  123456
-- 4    user-4  123456
-- 5    user-5  123456

repeat循环

相当于C语言里的do...while...语句

[标签:]repeat 
 循环体;
until 条件表达式
end repeat [标签];
-- ----------REPEAT-----------
use mydb7_procedure;
truncate table user;
delimiter $$
create procedure proc16_repeat(in insertcount int)
begin
    declare i int default 1;
    label:REPEAT
        insert into user(uid,username,`password`) values(i,concat('user-',i),'123456');
                set i=i+1;
                UNTIL i>insertcount -- 跳出循环
    end REPEAT label;
end $$
delimiter ;
call proc16_repeat(10);
-- 运行结果:
-- 1    user-1  123456
-- 2    user-2  123456
-- 3    user-3  123456
-- 4    user-4  123456
-- 5    user-5  123456
-- 6    user-6  123456
-- 7    user-7  123456
-- 8    user-8  123456
-- 9    user-9  123456
-- 10   user-10 123456

loop循环

[标签:] loop
  循环体;
  if 条件表达式 then 
     leave [标签]; 
  end if;
end loop;

loop循环就是个死循环,用if判断然后leave才能跳出循环。

这里不再举例。


声明:内容来源于B站视频《2022黑马程序员最新MySQL知识精讲+mysql实战案例_零基础mysql数据库入门到高级全套教程》,博客内容仅作学习参考使用。



博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/mysql21.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 06 月 05 日
如果觉得我的文章对你有用,请随意赞赏