一、流程控制结构概述
流程控制一共分为三种:顺序、分支、循环
二、分支
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);
三、循环结构
循环结构一共分为三类:while、loop、repeat
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;
}
插入
}
*/