MySQL 中的流程控制语句

2020-09-28 17:43:43 浏览数 (1)

1.1 if 语句

1.1.1 语法

代码语言:javascript复制
# 当条件表达式为 true 的时候,返回 值1,否则返回 值2
if(条件表达式, 值1, 值2); 

# 类似 java 中的 if ··· else if ··· else 【只能使用在 begin end 之间】
if 条件语句1 then 语句1;
elseif 条件语句2 then 语句2;
...
else 语句n;
end if;

1.1.2 示例

代码语言:javascript复制
mysql> select * from student;
 ---- ----- -------- 
| id | sex | name   |
 ---- ----- -------- 
|  1 | 1   | 王大锤 |
|  2 | 0   | 萌妹子 |
|  3 | 0   | 小姐姐 |
|  4 | 1   | 牛魔王 |
 ---- ----- -------- 
4 rows in set (0.09 sec)


mysql> select id as '编号', if(sex = 1, '男', '女') as '性别', name as '姓名' from student;
 ------ ------ -------- 
| 编号 | 性别 | 姓名   |
 ------ ------ -------- 
|    1 | 男   | 王大锤 |
|    2 | 女   | 萌妹子 |
|    3 | 女   | 小姐姐 |
|    4 | 男   | 牛魔王 |
 ------ ------ -------- 
4 rows in set (0.15 sec)


mysql> create procedure myif(a int)
begin
      declare sex varchar(20) default '男';
      declare a int default 1;
      if a = 1 then set sex = '男';
      elseif a = 0 then set sex = '女';
      end if;
      select sex;
end;

mysql> call myif(1);
 ----- 
| sex |
 ----- 
| 男  |
 ----- 
1 row in set (0.20 sec)

Query OK, 0 rows affected (0.04 sec)

mysql> drop procedure if exists myif;
Query OK, 0 rows affected (0.05 sec)

1.2 case 语句

1.2.1 语法

代码语言:javascript复制
# 第一种用法
case 表达式
	when 值1 then 结果1 或者 语句1	# 如果是语句需要加分号
	when 值2 then 结果2 或者 语句2
	...
else 结果n 或者 语句n
end [case] # 如果是放在 begin end 之间需要加 case,如果是在 select 后面 case 可以省略

# 第二种用法
case 
	when 条件1 then 结果1 或者 语句1 # 如果是语句需要加分号
	when 条件2 then 结果2 或者 语句2
	...
else 结果n 或者 语句n
end [case] 	# 如果是放在 begin end 之间需要加 case,如果是在 select 后面 case 可以省略

1.2.2 示例

代码语言:javascript复制
# 第一种用法
# 类似 java 中的 switch ··· case
mysql> select id as '编号',(case sex when 1 then '男' when 0 then '女' end) as '性别',name as '姓名' from student;
 ------ ------ -------- 
| 编号 | 性别 | 姓名   |
 ------ ------ -------- 
|    1 | 男   | 王大锤 |
|    2 | 女   | 萌妹子 |
|    3 | 女   | 小姐姐 |
|    4 | 男   | 牛魔王 |
 ------ ------ -------- 
4 rows in set (0.20 sec)

# 类似 java 中的 switch ··· case ··· default
mysql> select id as '编号',(case sex when 1 then '男' else '女' end) as '性别',name as '姓名' from student;
 ------ ------ -------- 
| 编号 | 性别 | 姓名   |
 ------ ------ -------- 
|    1 | 男   | 王大锤 |
|    2 | 女   | 萌妹子 |
|    3 | 女   | 小姐姐 |
|    4 | 男   | 牛魔王 |
 ------ ------ -------- 
4 rows in set (0.18 sec)


# 第二种用法
mysql> select id '编号',(case when sex = 1 then '男' when sex = 0 then '女' end) '性别',name '姓名' from student;
 ------ ------ -------- 
| 编号 | 性别 | 姓名   |
 ------ ------ -------- 
|    1 | 男   | 王大锤 |
|    2 | 女   | 萌妹子 |
|    3 | 女   | 小姐姐 |
|    4 | 男   | 牛魔王 |
 ------ ------ -------- 
4 rows in set (0.20 sec)

1.3 循环

1.3.1 while 循环

语法

代码语言:javascript复制
标签:while 循环条件 do
	循环体
end while 标签;

说明  ① 标签是给 while 取个名字,标签和 iterate、leave 结合用于在循环内部对循环进行控制。  ② 个循环先判断条件,条件成立之后,才会执行循环体,每次执行都会先进行判断。

循环控制

代码语言:javascript复制
# 类似 java中的 continue
iterate 循环标签;

# 类似 java 中的 break
leave 循环标签;

示例

代码语言:javascript复制
# 求 1 ~ n 的和
# 创建存储过程
mysql> create procedure sumnum(a int) 
    begin
    	# default 是指定该变量的默认值
        declare sum int default 0;  
        declare i int default 1;
    while i<=a do # 循环开始
        set sum = sum   i;
        set i = i   1;
    end while; # 循环结束
    select sum;  # 输出结果
    end;
Query OK, 0 rows affected (0.06 sec)

# 执行存储过程
mysql> call sumnum(100);
 ------ 
| sum  |
 ------ 
| 5050 |
 ------ 
1 row in set (0.08 sec)
Query OK, 0 rows affected (0.04 sec)

# 删除存储过程
mysql> drop procedure if exists sumnum;
Query OK, 0 rows affected (0.05 sec)

1.3.2 loop 循环

语法

代码语言:javascript复制
# 死循环
标签:loop
循环体;
end loop 标签;

示例

代码语言:javascript复制
# 求 1 ~ n 的和
# 创建存储过程
mysql> create procedure sumnum(a int)
begin
        declare sum int default 0;
        declare i int default 1;
        loop_name:loop # 循环开始
            if i > a then 
                leave loop_name;  # 结束循环,类似于 break
            end if;
            set sum = sum   i;
            set i = i   1;
        end loop;  # 循环结束
        select sum; # 输出结果
end;
Query OK, 0 rows affected (0.06 sec)

# 执行存储过程
mysql> call sumnum(100);
 ------ 
| sum  |
 ------ 
| 5050 |
 ------ 
1 row in set (0.09 sec)
Query OK, 0 rows affected (0.04 sec)

# 删除存储过程
mysql> drop procedure if exists  sumnum;
Query OK, 0 rows affected (0.07 sec)

1.3.3 repeat 循环

  repeat 循环类似于 java 中的 do ··· while 循环,不管如何,循环都会先执行一次,然后再判断结束循环的条件,不满足结束条件,循环体继续执行。这跟和 while 循环不同,while 是先判断条件是否成立再执行循环体。

语法

代码语言:javascript复制
标签:repeat
	循环体;
until 结束循环的条件 end repeat 标签;

示例

代码语言:javascript复制
# 求 1 ~ n 的和
# 创建存储过程
mysql> create procedure sumnum(a int)
  begin
       declare sum int default 0;
       declare i int default 1;
       repeat # 循环开始
           set sum = sum   i;
           set i = i   1;
       until i > a end repeat; # 循环结束
       select sum; # 输出结果
  end;
Query OK, 0 rows affected (0.06 sec)

# 执行存储过程
mysql> call sumnum(100);
 ------ 
| sum  |
 ------ 
| 5050 |
 ------ 
1 row in set (0.10 sec)
Query OK, 0 rows affected (0.04 sec)

# 删除存储过程
mysql> drop procedure if exists sumnum;
Query OK, 0 rows affected (0.07 sec)

0 人点赞