小言_互联网的博客

18—— 流程控制:if、while 结构

261人阅读  评论(0)

一、分支结构

**** 基础知识 ****

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场