分支结构
if函数
可以实现简单的双分支
语法:if(expr1,expr2,expr3)
执行顺序:expr1成立则返回expr2的值,反之返回expr3的值
case结构
两种情况:
- 类似于switch,一般用于实现等值判断
语法:
case 变量|表达式|字段
when 判断的值 then 返回的值1或语句1
when 判断的值 then 返回的值2或语句2
...
else 返回的值n或语句n
end;
- 类似于多重if,用于实现区间判断
语法:
case
when 判断的条件1 then 返回的值1或语句1
when 判断的条件2 then 返回的值2或语句2
...
else 返回的值n或语句n
end;
注意:如果是语句要在结尾加上分号
特点:
- 可以作为表达式嵌套在其它语句中,可以放在任何地方,begin end中或外
- 可以作为独立语句,只能放在begin end中
- 若else省略,且所有条件均不满足,则返回NULL
if结构
实现多重分支
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句n;
end if;
应用场景:只能用在begin end中
循环结构
三种循环结构都只能用在begin end中
循环控制
- iterate:类似于continue,继续,结束本次循环,继续下一次
- leave:类似于break,跳出,结束当前所在循环
while
语法:
【标签:】 while 循环条件 do
循环体
end while 【标签】;
注:
- 标签就类似于循环起名字,可以不加,如果要加循环控制语句,就要加上标签
loop
语法:
【标签:】 loop
循环体
end loop 【标签】;
- 可以用来模拟简单的死循环
repeat
语法:
【标签:】 repeat
循环体
until 结束循环的条件
end repeat 【标签】;
例子
- 批量插入,根据次数插入到admin表中多条记录,次数大于20则停止(要使用循环控制)
CREATE PROCEDURE test_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'00000');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $
- 已知表stringcontent 其中字段:
id 自增长
content varchar(20)
向该表插入指定个数的,随机的字符串
CREATE PROCEDURE insert_char(IN num INT)
BEGIN
DECLARE i INT DEFAULT 1; #定义循环变量i
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijkmlnopqrstuvwxyz'; #定义一个字符串用于生成随机字符串
DECLARE startindex INT DEFAULT 1;#起始索引
DECLARE len INT DEFAULT 1;#截取长度
REPEAT
SET len=FLOOR(RAND()*20-startindex+1)+1);#产生随机整数代表截取长度1-(26-startindex+1)
SET startindex=FLOOR(RAND()*26+1);#产生随机整数代表起始索引1-26
INSERT INTO stringcontent(content)
VALUES(SUBSTR(str,startindex,len));
UNTIL i=num;
SET i=i+1;
END REPEAT $