MySQL—流程控制结构(十二)

一、流程控制结构概述

流程控制一共分为三种:顺序、分支、循环

二、分支

1 if函数

语法:if(条件,值1,值2)
功能:实现双分支
适用范围:应用在begin end中或外面

2 case结构

语法:
1>情况1:类似于switch
case 变量或表达式
when 值1 then 语句1;
when 值2 then 语句2;
...
else 语句n;
end 

2>情况2:
case 
when 条件1 then 语句1;
when 条件2 then 语句2;
...
else 语句n;
end 

使用范围:应用在begin end 中或外面

3 if结构

语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
....
else 语句n;
end if;
功能:类似于多重if

使用范围:只能应用在begin end 中

4 案例分析

4.1 案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D

-- 1 案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
-- 1.1 创建函数
DELIMITER $
# 创建名为test_if的函数,返回值为CHAR
CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
BEGIN
	# 定义一个CHAR类型的局部变量ch,默认值为'A'
	DECLARE ch CHAR DEFAULT 'A';
	# if结构
	IF score>90 THEN SET ch='A';
	ELSEIF score>80 THEN SET ch='B';
	ELSEIF score>60 THEN SET ch='C';
	ELSE SET ch='D';
	END IF;
	# 返回ch
	RETURN ch;
END $

-- 1.2 调用test_if
SELECT test_if(87);

4.2 案例2:创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500

-- 2 案例2:案例2:创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500

-- 数据准备
CREATE TABLE `employees` (
  `employee_id` int(6) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(20) DEFAULT NULL,
  `last_name` varchar(25) DEFAULT NULL,
  `email` varchar(25) DEFAULT NULL,
  `phone_number` varchar(20) DEFAULT NULL,
  `job_id` varchar(10) DEFAULT NULL,
  `salary` double(10,2) DEFAULT NULL,
  `commission_pct` double(4,2) DEFAULT NULL,
  `manager_id` int(6) DEFAULT NULL,
  `department_id` int(4) DEFAULT NULL,
  `hiredate` datetime DEFAULT NULL,
  PRIMARY KEY (`employee_id`)
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=utf8mb4;

-- 插入数据
insert  into `employees`(`employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate`) 
      values (100,'Steven','K_ing','SKING','515.123.4567','AD_PRES',2400.00,NULL,NULL,90,'1992-04-03 00:00:00')
            ,(101,'Neena','Kochhar','NKOCHHAR','515.123.4568','AD_VP',1700.00,NULL,100,90,'1992-04-03 00:00:00')
            ,(102,'Lex','De Haan','LDEHAAN','515.123.4569','AD_VP',1700.00,NULL,100,90,'1992-04-03 00:00:00')
            ,(103,'Alexander','Hunold','AHUNOLD','590.423.4567','IT_PROG',9000.00,NULL,102,60,'1992-04-03 00:00:00')
            ,(104,'Bruce','Ernst','BERNST','590.423.4568','IT_PROG',6000.00,NULL,103,60,'1992-04-03 00:00:00')
            ,(105,'David','Austin','DAUSTIN','590.423.4569','IT_PROG',4800.00,NULL,103,60,'1998-03-03 00:00:00')
            ,(106,'Valli','Pataballa','VPATABAL','590.423.4560','IT_PROG',4800.00,NULL,103,60,'1998-03-03 00:00:00');


-- 2 创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500
-- 2.1 创建存储过程
DELIMITER $
# 创建名为test_if_pro的存储结构,输入参数为DOUBLE类型的sal
CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
BEGIN
	# if结构
	IF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal;
	ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal;
	ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal;
	END IF;
	
END $

-- 2.2 调用存储过程
CALL test_if_pro(2400);

4.3 案例3:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D

-- 3 案例3:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
-- 3.1 创建函数
DELIMITER $
# 创建名为test_case的函数,输入值为FLOAT类型,返回值为CHAR类型
CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
BEGIN
	# 定义CHAR类型的局部变量,默认值为'A'
	DECLARE ch CHAR DEFAULT 'A';
	# CASE结构
	CASE 
	WHEN score>90 THEN SET ch='A';
	WHEN score>80 THEN SET ch='B';
	WHEN score>60 THEN SET ch='C';
	ELSE SET ch='D';
	END CASE;
	# 返回ch
	RETURN ch;
END $

-- 3.2 调用函数
SELECT test_case(56);

三、循环结构

        循环结构一共分为三类:whilelooprepeat

1>iterate类似于 continue,继续,结束本次循环,继续下一次
2>leave 类似于  break,跳出,结束当前所在的循环

1 while

语法:

【标签:】while 循环条件 do
    循环体;
end while【 标签】;

联想Java中的while循环:
while(循环条件){

    循环体;

}

2 loop

语法:

【标签:】loop
    循环体;
end loop 【标签】;

可以用来模拟简单的死循环

3 repeat

语法:

【标签:】repeat
    循环体;
until 结束循环的条件
end repeat 【标签】;

4 案例分析

4.1 案例:批量插入,根据次数插入到admin表中多条记录

-- 1 案例:批量插入,根据次数插入到admin表中多条记录
-- 1.1 创建存储过程
DELIMITER $
# 创建名为pro_while1的存储过程,接收一个INT类型的参数insertCount
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
	# 创建一个INT类型的局部变量i,默认值为1
	DECLARE i INT DEFAULT 1;
	# WHILE循环
	WHILE i<=insertCount DO
		INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
		SET i=i+1;
	END WHILE;
END $

-- 1.2 调用存储过程
CALL pro_while1(5)$

/*
等同于:
int i=1;
while(i<=insertcount){

	//插入
	
	i++;

}
*/

4.2 案例:批量插入,根据次数插入到admin表中多条记录,如果次数>=8则停止

-- 2 案例:批量插入,根据次数插入到admin表中多条记录,如果次数>=8则停止
-- 2.1 创建存储过程
DELIMITER $
# 创建名为pro_while2的存储过程,接收一个INT类型的参数insertCount
CREATE PROCEDURE test_while2(IN insertCount INT)
BEGIN
	# 定义一个INT类型的变量i,默认值为1
	DECLARE i INT DEFAULT 1;
	# WHILE循环
	a:WHILE i<=insertCount DO
		INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
		# IF 结构:如果i>=8则跳出while循环
		IF i>=8 THEN LEAVE a;
		END IF;
		SET i=i+1;
	END WHILE a;
END $

-- 2.2 调用存储结构
CALL test_while2(10);

4.3 案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次

-- 3 案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
-- 3.1 创建存储过程
DELIMITER $
# 创建名为pro_while3的存储过程,接收一个INT类型的参数insertCount
CREATE PROCEDURE test_while3(IN insertCount INT)
BEGIN
	# 定义一个INT类型的变量i,默认值为1
	DECLARE i INT DEFAULT 0;
	# WHILE循环
	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('luoji',i),'0000');
	END WHILE a;
END $

-- 3.2 调用存储过程
CALL test_while3(10)$


/*
等同于:
int i=0;
while(i<=insertCount){
	i++;
	if(i%2==0){
		continue;
	}
	插入
}
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值