`account``customers`#流程控制结构
/*
顺序结构
分支结构
循环结构
*/
#一、分支结构
#1.if函数
/*
if(表达式1,表达式2,表达式3):
如果表达式1成立,返回表达式2,;不成立,返回表达式3
*/
#2.case函数
/*
情况1:一般用于等值判断
语法: case 变量|表达式|字段
when 要判断的值1 then 返回的值1或 语句1;
when 要判断的值2 then 返回的值2或 语句2;
...
else 返回的值n
end case(返回语句时加case)
情况2:一般用于区间判断
语法: case
when 要判断的条件1 then 返回的值1或 语句1;
when 要判断的条件2 then 返回的值2或 语句2;
...
else 返回的值n
end case(返回语句时加case)
特点:
可以作为表达式,放在任何地方;
也可以作为独立的语句,只能放在begin end中
*/
#案例1:创建一个存储过程,输入一个成绩,返回等级。如果成绩在90-100,返回A;如果成绩在80-90,返回B;如果成绩在70-80,返回C;否则返回D
DELIMITER $
CREATE PROCEDURE test_pro1(IN score DOUBLE)
BEGIN
CASE
WHEN score BETWEEN 90 AND 100 THEN SELECT 'A';
WHEN score BETWEEN 80 AND 90 THEN SELECT 'B';
WHEN score BETWEEN 70 AND 80 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE;
END$
CALL test_pro1(69)$
DELIMITER $
CREATE PROCEDURE test_pro2(IN score DOUBLE)
BEGIN
SELECT
CASE
WHEN score BETWEEN 90 AND 100 THEN 'A'
WHEN score BETWEEN 80 AND 90 THEN 'B'
WHEN score BETWEEN 70 AND 80 THEN 'C'
ELSE 'D'
END;
END$
CALL test_pro2(89)$
#3.if结构
/*
功能:实现多重分支
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
【else 语句n;】
end if;
只能应用在begin end中
*/
#案例:输入一个成绩,返回等级。如果成绩在90-100,返回A;如果成绩在80-90,返回B;如果成绩在70-80,返回C;否则返回D
DELIMITER $
CREATE FUNCTION testIf(score INT) RETURNS CHAR(1)
BEGIN
DECLARE grade CHAR(1);
IF score BETWEEN 90 AND 100 THEN SELECT 'A' INTO grade;
ELSEIF score BETWEEN 80 AND 90 THEN SELECT 'B' INTO grade;
ELSEIF score BETWEEN 70 AND 80 THEN SELECT 'C' INTO grade;
ELSE SELECT 'D' INTO grade;
END IF;
RETURN grade;
END$
SELECT testIf(96)$
#二、循环结构
/*
1.while
2.loop
3.repeat
循环控制
iterate:类似于continue,结束本次循环,继续下一次
leave:类似于break,结束当前循环
*/
#1.while
/*
语法:
【标签:】while 循环条件 do
循环体;
end while【标签】;
*/
#2.loop
/*
语法:
【标签;】loop
循环体
end loop【标签】;
可以用来模拟简单的死循环
*/
#3.repeat
/*
语法:
【标签:】repeat
循环体
until 不循环的条件
end repeat【标签】;
*/
#无循环控制
#案例1:批量插入,根据次数插入到admin表中多条记录
DELIMITER $
CREATE PROCEDURE test_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('john',i),'6666');
SET i=i+1;
END WHILE;
END $
#调用
CALL test_while(100)$
#添加leave语句
#案例1:批量插入,根据次数插入到admin表中多条记录,如果次数>20,则停止
DELIMITER $
CREATE PROCEDURE test_leave(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<= insertCount DO
INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('sunny',i),'2333');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END$
CALL test_leave(25)$
#添加iterate语句
#案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数
DELIMITER $
CREATE PROCEDURE test_iterate(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<insertCount DO
SET i=i+1;
IF i%2 THEN ITERATE a;
END IF;
INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('david',i),'2150');
END WHILE a;
END$
#流程控制经典案例
#案例1:
/*
已知表stringcontent
其中字段:
id 自增长
content varchar(20)
向该表插入指定个数的,随机的字符串
*/
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
);
DELIMITER $
CREATE PROCEDURE test1(IN strcount INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startindex INT DEFAULT 1;#起始索引
DECLARE len INT DEFAULT 1;
DECLARE slength INT DEFAULT 1;#最终截取字符串长度长度
DECLARE sustr VARCHAR(20);
WHILE i<=strcount DO
SET startindex = FLOOR(RAND()*26+1);#rand():0-1的随机数
SET len = FLOOR(RAND()*(26-startindex +1)+1);#最多能截取26-startindex+1个字符串
SET slength = IF(len>20,20,len);#content的长度最大为20
SET sustr = SUBSTR(str,startindex,slength);
INSERT INTO stringcontent(content) VALUES(sustr );
SET i=i+1;
END WHILE;
END $