1. 分类
- 顺序结构:程序从上往下一次执行
- 分支结构:程序从两条或多条路径中选择一条去执行
- 循环结构:程序在满足一定条件的基础上,重复执行一段代码
2. 分支结构
2.1 if 函数
- 功能:实现简单的双分支
- 语法:
IF (表达式1, 表达式2, 表达式3)
- 执行顺序:如果表达式1成立,则 IF 函数返回表达式2的值,否则返回表达式3的值
2.2 case结构
2.2.1 类似于java中的 switch 语句,一般用于实现等值判断
CASE 变量|表达式|字段
WHEN 要判断的值1 THEN 返回值1或语句1
WHEN 要判断的值2 THEN 返回值2或语句2
…
ELSE 返回值n或语句n
END CASE ;
2.2.2 类似于java中的多重 IF 语句,一般用于实现区间判断**
CASE
WHEN 要判断的条件1 THEN 返回值1或语句1
WHEN 要判断的条件2 THEN 返回值2或语句2
…
ELSE 返回值n或语句n
END CASE ;
特点
- 既可以作为表达式,嵌套在其他语句中使用,此时任何位置都可以使用
也可以作为独立的语句去使用,此时只能用于 BEGIN END 中 - 如果 when 中的值满足或条件成立,则执行对应的 THEN 后的语句,并且结束 CASE
如果都不满足,则执行 ELSE 中的语句或值 - ELSE 可以省略,此时如果所有的 WHEN 都不满足,则返回 NULL
2.3 if 结构
- 功能:实现多重分支
- 语法:
IF 条件1 THEN 语句1 ;
ELSEIF 条件2 THEN 语句2 ;
…
ELSE 语句n ;
END IF ;
- 使用条件:只能放在 BEGIN END 中
2.4 实例
创建存储过程:根据传入的成绩来显示等级
CREATE PROCEDURE pro1 (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 $
CREATE FUNCTION fun_ko (score INT) RETURNS CHAR
BEGIN
DECLARE result CHAR ;
IF score >= 90 THEN SELECT 'A' INTO result ;
ELSEIF score >= 80 THEN SELECT 'B' INTO result ;
ELSEIF score >= 60 THEN SELECT 'C' INTO result ;
ELSE SELECT 'D' INTO result ;
END IF ;
RETURN result ;
END $
3. 循环结构
3.1 分类
- while
标签 :
WHILE
循环条件 DO 循环体 ;
END WHILE 标签;
- loop(可模拟简单的死循环)
标签 :
LOOP
循环体 ;
END LOOP 标签;
- repeat
标签 :
REPEAT
循环体 ;
UNTIL 结束循环的条件
END REPEAT 标签;
循环控制
- iterate:作用类似于continue
- leave:作用类似于break
3.2 实例
批量插入,根据次数插入到表中多条记录
CREATE PROCEDURE pro_op (IN intimes INT)
BEGIN
insertBoys :
WHILE
intimes > 0 DO
INSERT INTO boys (boyName, userCP)
VALUES
('沈千枫', 120) ;
SELECT intimes - 1 INTO intimes ;
END WHILE insertBoys ;
END $
批量插入,根据次数插入到表中多条记录,如果次数大于20则停止
CREATE PROCEDURE pro_lk (IN intimes INT)
BEGIN
DECLARE i INT DEFAULT 1;
insertBoys :
WHILE
i <= intimes DO
INSERT INTO boys (boyName, userCP)
VALUES
('蓝湛', 1200) ;
IF i>=20 THEN LEAVE insertBoys ;
END IF ;
SELECT i + 1 INTO i ;
END WHILE insertBoys ;
END $
批量插入,根据次数插入到表中多条记录,偶数的数值不插入
CREATE PROCEDURE pro_lk (IN intimes INT)
BEGIN
DECLARE i INT DEFAULT 0;
insertBoys :
WHILE
i <= intimes DO
SELECT i + 1 INTO i ;
IF i%2=0 THEN ITERATE insertBoys ;
END IF ;
INSERT INTO boys (boyName, userCP)
VALUES
('沈兰舟', 1200 + i) ;
END WHILE insertBoys ;
END $