一、分支结构
**** 基础知识 ****
1、if 函数
# 如果表达式1成立,则返回表达式2的值,否则返回表达式3的值
if(表达式1,表达式2,表达式3)
2、case 结构
(1)、语法:
情况1:类似于Java中的switch语句,一般用于等值判断:
# 返回结果为值时
case 变量|表达式|字段
when 要判断的值1 then 返回值1
when 要判断的值2 then 返回值2
. . . . .
else 要返回的值n
end
# 返回结果语句时,每句判断后都要加分号
case 变量|表达式|字段
when 要判断的值1 then 返回语句1;
when 要判断的值2 then 返回语句2;
. . . . .
else 要返回的语句n;
end case;
情况2:类似于Java中的多重if 语句,一般用于实现区间判断
# 返回结果为值时,将用于嵌套使用
case
when 要判断的条件1 then 返回值1
when 要判断的条件2 then 返回值2
. . . . .
else 要返回的值n
end
# 返回结果语句时,每句判断后都要加分号。将作为单独的语句来使用
case
when 要判断的条件1 then 返回语句1;
when 要判断的条件2 then 返回语句2;
. . . . .
else 要返回的语句n;
end case;
(2)、特点:
- 可以作为表达式,嵌套在其它语句中使用,此时可放在任何地方
- 可以作为独立语句使用,只能放在 begin end 中
- 执行顺序:如果when 中的值满足条件,则执行对应的then后面的语句,并结束case
- else可以省略,如果else省略了,并且所有when条件都不满足,则返回null
3、if 结构:实现多重分支
(1)、语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
. . . . . .
else 语句n;
end if;
(2)、特点:
- 只能应用在 begin end 中,范围较小
**** 分支结构应用实例 ****
1、创建存储过程,根据传入的成绩,来显示等级
(1)、使用 case 结构来表示:
DELIMITER $
CREATE PROCEDURE pdr01(IN score INT)
BEGIN
CASE
WHEN score>=90 AND score<=100 THEN SELECT 'A';
WHEN score<=90 THEN SELECT 'B';
ELSE SELECT 'C';
END CASE;
END $
CALL pdr01(98)$
(2)、使用 if 结构来表示:
DELIMITER $
CREATE FUNCTION pdr02(scor INT) RETURNS CHAR DETERMINISTIC
BEGIN
IF scor>90 AND scor<=100 THEN RETURN 'A';
ELSEIF scor>80 AND scor<=90 THEN RETURN 'B';
ELSEIF scor>70 AND scor<=80 THEN RETURN 'C';
ELSE RETURN 'D';
END IF;
END $
SELECT pdr02(88)$
二、循环结构
**** 基础知识 ****
1、分类总结:
(1)循环分类:while 、 loop、repeat
(2)循环控制:
- iterate:类似于 continue,继续。结束本次循环,继续下一次
- leave:类似于 break,跳出。结束当前的所在循环
2、while 循环
(1)、语法
[标签:] while 循环条件 do
循环体;
end while [标签];
(2)、分析
- 标签为可选项,加标签相当于为循环起名字,可以进行控制
3、loop 循环
(1)、语法
[标签:] loop
循环体;
end loop [标签];
(2)、分析
- loop 循环没有循环条件,所以为死循环
- 相当于 do while 语句
4、repeat 循环
(1)、语法:
[标签:] repeat
循环体;
until 结束循环的条件
end repeat [标签];
**** 循环结构应用实例 ****
1、批量插入,往stuinfo表中插入多条数据(stuinfo 表原始数据为空)
DELIMITER $
CREATE PROCEDURE pd01(IN num INT) # 由于没有返回值,所以要用存储过程
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i<num DO
INSERT INTO stuinfo VALUES(i,CONCAT('Tony',i),i*10);
SET i=i+1;
END WHILE;
END $
CALL pd01(11)$
SELECT * FROM stuinfo$
2、批量插入,往stuinfo表中插入多条数据(stuinfo 表原始数据为空),如果次数大于20,则停止
DELIMITER $
CREATE PROCEDURE pd02(IN num INT)
BEGIN
DECLARE i INT DEFAULT 1;
ts:WHILE i<num DO
INSERT INTO stuinfo(id,sname) VALUES(i,CONCAT('Kity',i));
IF i>=20 THEN LEAVE ts;
END IF;
SET i=i+1;
END WHILE ts;
END $
CALL pd02(30)$
SELECT * FROM stuinfo $
3、批量插入,往stuinfo表中插入多条数据(stuinfo 表原始数据为空),只插入偶数
DELIMITER $
CREATE PROCEDURE pd03(IN num INT)
BEGIN
DECLARE i INT DEFAULT 1;
ts:WHILE i<num DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE ts;
END IF;
INSERT INTO stuinfo(id,sname) VALUES(i,CONCAT('Kity',i));
END WHILE ts;
END $
CALL pd03(30)$
SELECT * FROM stuinfo $
4、已知表 tba(数据为空) ,其中字段 id 为自增,向该表中插入指定个数的随机的字符串:
# 创建tba的表
CREATE TABLE tba(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
);
# 创建存储过程
DELIMITER $
CREATE PROCEDURE pd04(IN num INT)
BEGIN
DECLARE i INT DEFAULT 1; # 循环遍历
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startIndex INT DEFAULT 1; # 起始索引
DECLARE len INT DEFAULT 1; # 截取字符的长度
WHILE i<=num DO
# 产生一个随机整数代表截取的长度:1到26-startIndex+1
SET len=FLOOR(RAND()*(20-startIndex+1)+1);
# 产生一个随机整数,代表起始索引为1到26之间的数字
SET startIndex=FLOOR(RAND()*26+1);
INSERT INTO tba(content) VALUES(SUBSTR(str,startIndex,len));
SET i=i+1;
END WHILE;
END $
CALL pd04(10)$
SELECT * FROM tba $
注意:
- rand() :为随机数,范围在0~1之间
- floor():为向下取整
- substr():为截取子字符串
转载:https://blog.csdn.net/Jeffxu_lib/article/details/102481359
查看评论