mysql: 分支 & 循环
2019-08-28 本文已影响0人
哈斯勒
#流程控制语句
/*
顺序结构:
分支结构:
循环结构:
*/
#一、分支结构
# if函数
/*
功能:实现简单的双分支
语法:
if(表达式一,表达式2,表达式3) 类似条件语句
应用:
任何位置
*/
#二、case结构
#特点
/*①
可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,begin end中或begin end的外面
可以作为独立的语句去使用,只能放在begin end 中
②
如果when中的值满足或条件成立,则执行对应的then后面的语句,并且结束case
如果都不满足,执行else
③
else可以省略,如果else省略,且所有的when条件都不满足,则返回null
*/
/*
情况1:类似于java中switch语句,一般用于实现等值判断
case 要判断的字段或表达式:
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
else 要显示的值n或语句n
end
#查询员工的工资
部门号=30,显示工资*1.1
=40 1.2
=50 1.3
其他 1
SELECT last_name, department_id, salary 原始工资,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
情况2:类似于if,一般用于实现区间判断
case
when 条件1 then 要显示值1或语句1
when 条件2 then 要显示值2或语句2
else 要显示值n或语句n
end
#案例 查询员工的工资情况
#如果工资>20000, 显示A级别
>15000 B
>10000 C
否则,显示D级别
SELECT last_name, department_id,salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM employees;
*/
# 案例:创建存储过程,根据传入的成绩,来显示等级,90-100 A 80-90B 60-90 C 否则D
CREATE PROCEDURE test_case(IN score INT)
BEGIN
CASE
WHEN score<=100 AND score<=90 THEN SELECT 'A';
WHEN score>=90 THEN SELECT 'B';
WHEN score>=80 THEN SELECT 'C';
WHEN score>=60 THEN SELECT 'D';
ELSE SELECT 'D';
END CASE;
END $
CALL test_case(95)$
#if结构
/*
实现多重分支
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
[else 语句n;]
end if;
只能用在begin end中
*/
#创建存储过程,根据传入的成绩,来返回等级,90-100 A 80-90B 60-90 C 否则D
CREATE FUNCTION test_if(score INT)RETURNS CHAR
BEGIN
IF score>=90 AND score<=100 THEN RETURN 'A';
ELSEIF score>=80 THEN RETURN 'B';
ELSEIF score>=60 THEN RETURN 'C';
ELSE RETURN 'D';
END IF;
END $
SELECT test_if(80)$
#二、循环结构
/*
while loop repeat
循环控制:
iterate: 类似于continue,
leave:类似于break
*/
#while
/*
[标签:]while 循环条件 do
循环体;
end while[标签];
# 标签是为添加循环控制
*/
#loop
/*
[标签:]loop
循环体;
end loop[标签];
可用来模拟简单的死循环
*/
#repeat
/*
[标签:]repeat
循环体;
until 结束循环的条件
end repeat[标签];
*/
# 批量插入,根据设置的次数,插入admin多条记录
CREATE PROCEDURE pro_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;#声明并输出话
WHILE i<=insertCount DO
INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('rose',i),'666');
SET i=i+1;
END WHILE;
END $
CALL pro_while(10)$
#2. 添加leave语句
# 批量插入,根据设置的次数,插入admin多条记录,如果次数>20,则停止
CREATE PROCEDURE test_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;#声明并输出话
a:WHILE i<=insertCount DO
INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('xiaohua',i),'666');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $
CALL test_while(10)$
#3.添加iterate
# 批量插入,根据设置的次数,插入admin多条记录,直插入偶数次
CREATE PROCEDURE test_iterate1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;#声明并输出话
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,PASSWORD) VALUES (CONCAT('xiao',i),'666');
END WHILE a;
END $
CALL test_iterate1(10)$
SELECT * FROM admin WHERE username LIKE 'xiao2';