顺序结构:程序从上往下依次执行。
分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行。
循环结构:程序满足一定条件下,重复执行一组语句。
1 分支结构
1.1 IF函数
功能:实现简单的双分支
语法:
IF(表达式1,表达式2,表达式3)
执行顺序:
如果表达式1成立,则IF函数返回表达式2的值,否则返回表达式3的值。
应用范围:任何地方。
1.2 CASE分支结构
情况1 :类似C++中的switch语句,一般用于实现等值判断。
情况2:类似于C++中的多重if判断语句,一般用于实现区间判断。
语法:
1 CASE结构作为表达式,认为是一条语句,可以应用在任何地方
#情况1
CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回的值1
WHEN 要判断的值 THEN 返回的值2
...
ELSE 要返回的值n
END;
#情况2:
CASE
WHEN 要判断的条件1 THEN 返回的值1
WHEN 要判断的条件2 THEN 返回的值2
...
ELSE 要返回的值n
END;
2 CASE结构作为独立的语句,认为是一组语句,只能放在BEGIN END中使用。
#情况1
CASE 变量|表达式|字段
WHEN 要判断的值 THEN 语句1; #可以为多条语句
WHEN 要判断的值 THEN 语句2;
...
ELSE 语句n;
END CASE;
#情况2:
CASE
WHEN 要判断的条件1 THEN 语句1; #可以为多条语句
WHEN 要判断的条件2 THEN 语句2;
...
ELSE 语句n;
END CASE;
注:
1 作为表达式时可以嵌套在其他的语句中使用。
2 ELSE可以省略,如果省略了且所有条件或值都没有成立则返回NULL。
示例:
#创建存储过程,根据传入的成绩,显示出等级。
DELIMITER $
CREATE PROCEDURE test_case( IN score INT)
BEGIN
CASE
WHEN score>=90 THEN SELECT 'A';
WHEN score>=80 THEN SELECT 'B';
WHEN score>=60 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE;
END $
DELIMITER ;
1.3 IF分支结构
功能:实现多重分支
语法:
if 条件1 then 语句1;
else if 条件2 then 语句2; #可以为多条语句
...
else 语句n;
end if;
位置: 只能放在begin end中。
示例:
#创建存储过程,根据传入的成绩,显示出等级。
DELIMITER $
CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN
IF score>=90 THEN RETURN 'A';
ELSEIF score>=80 THEN RETURN 'B';
ELSEIF score>=60 THEN RETURN 'C';
ELSE RETURN 'D';
END IF;
END $
DELIMITER ;
2 循环结构
语法:
(1)while:先判断后执行
【名称:】while 循环条件 do
循环体
end while 【名称】;
(2)loop:一般用于实现简单的死循环
【名称:】loop
循环体
end loop 【名称】;
(3)repeat:先执行后判断,无条件至少执行一次
【名称:】repeat
循环体
until 结束条件 end repeat 【名称】;
应用位置:
只能放在BEGIN END中
特点:
三种循环都可以省略名称,但如果循环中添加了循环控制语句(leave或者iterate),则必须添加名称。 循环可以嵌套。
循环控制语句:
leave:类似于break,用于跳出所在的循环
iterate:类似于continue,用于结束本次循环,继续下一次
示例1:
批量插入,根据次数插入到admin表中多条记录,如果次数大于20则停止。
DROP PROCEDURE IF EXISTS test_while;
DELIMITER $
CREATE PROCEDURE test_while(IN insertCout INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username, password) VALUES(CONCAT('xiaohua', i), 88888);
IF i>=20 THEN LEAVE a;
END IF;
SET i = i+1;
END WHILE a;
END $
DELIMITER ;
CALL test_while(100);
示例2:
创建表stringcontent,其中字段:id自增长,content varchar(20)。
向表中插入指定个数的随机字符串
#建表
DROP TABLE IF EXISTS stringcontent;
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content varchar(20)
);
#创建存储过程
DROP PROCEDURE IF EXISTS randstrInsert;
DELIMITER $
CREATE PROCEDURE randstrInsert(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1; #循环变量,插入次数
DECLARE j INT DEFAULT 1; #循环变量,字符串长度
DECLARE len INT DEFAULT 1; #随机数,字符串长度
DECLARE str_sourse VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE str_idx INT; #随机数,字符位置索引
DECLARE str_temp VARCHAR(20) DEFAULT '';
WHILE i<=insertCount DO
SET len = CEIL( RAND() * 20 ); #产生一个1~20的随机整数
SET j = 1;
SET str_temp = '';
REPEAT
SET str_idx = FLOOR(RAND() * 26 + 1); #产生一个1~26的随机整数
SET str_temp = CONCAT(str_temp, SUBSTR(str_sourse, str_idx , 1));
SET j = j+1;
UNTIL j > len END REPEAT; #长度达到len时跳出循环
#或者使用WHILE
/*
WHILE j <= len DO
SET str_idx = FLOOR(RAND() * 26 + 1); #产生一个1~26的随机整数
SET str_temp = CONCAT(str_temp, SUBSTR(str_sourse, str_idx , 1));
SET j = j+1;
END WHILE;
*/
INSERT INTO stringcontent(content) VALUES(str_temp);
SET i = i+1;
END WHILE;
END $
DELIMITER ;
#调用测试
CALL randstrInsert(10);
SELECT * from stringcontent;
#清空表格记录
TRUNCATE stringcontent;