文章目录

  • 1. 流程控制函数
  • 1.1IF函数
  • 1.2 CASE函数一(同java中switch case)
  • 1.3 CASE函数二(多重IF)
  • 2. 流程控制结构
  • 2.1 IF结构
  • 2.2 循环结构
  • 2.2.1 while循环
  • 2.2.2 loop循环
  • 2.2.3 repeat循环


1. 流程控制函数

不太推荐使用,因为有其他替代方式。

1.1IF函数

-- 语法(同java有区别,反而类似三元运算符)
IF(条件表达式,str1,str2)# 如果条件表达式为真则执行str1,否则执行str2
-- 示例
SELECT IF(10>5,'大','小');# 简单使用
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金,呵呵','有奖金,嘻嘻') 备注 FROM employees;# 复杂使用

1.2 CASE函数一(同java中switch case)

Java中switch…case的使用如下:

switch(变量或表达式){
	case 常量1:语句1;break;
	...
	default:语句n;break;
}

而MySQL使用的格式如下:

case 要判断的字段或表达式
    when 常量1 then 要显示的值1或语句1
    when 常量2 then 要显示的值2或语句2
    ...
    else 要显示的值n或语句n
    end

例如,有一个需求为:

案例:查询员工的工资,要求
部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50,显示的工资为1.3倍
其他部门,显示的工资为原工资

则SQL语句为:

SELECT
	salary 原始工资,
	department_id,
	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;

1.3 CASE函数二(多重IF)

java中的多重if:

if(条件1){
	语句1;
}else if(条件2){
	语句2;
}
...
else{
	语句n;
}

而在MySQL中的格式:

case 
    when 条件1 then 要显示的值1或语句1
    when 条件2 then 要显示的值2或语句2
    ...
    else 要显示的值n或语句n
end

若有如下需求:

案例:查询员工的工资的情况
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示C级别
否则,显示D级别

则SQL语句:

SELECT
	salary,
	CASE
		WHEN salary > 20000 THEN
			'A'
		WHEN salary > 15000 THEN
			'B'
		WHEN salary > 10000 THEN
			'C'
		ELSE
			'D'
		END AS 工资级别  # (以上一堆相当于一个salary)
FROM
	employees;

2. 流程控制结构

2.1 IF结构

在mysql中,IF结构与IF函数是不一样的

基本语法:

-- 语法
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
...
ELSE 语句n;
END IF; -- 表示IF结构结束了
-- 注释:只能用于BEGIN END块中

简单示例:

-- 示例:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
DELIMITER $
CREATE FUNCTION myfun1(score FLOAT) RETURNS CHAR
BEGIN
    DECLARE res CHAR DEFAULT ''; -- 定义变量来存储结果值
    IF score>90 THEN SET res='A';
    ELSEIF score>80 THEN SET res='B';
    ELSEIF score>60 THEN SET res='C';
    ELSE SET res='D';
    END IF;
    RETURN res;
END $
DELIMITER ; -- 恢复结束标记为分号
SELECT myfun1(89); -- 调用函数

2.2 循环结构

在MySQL中循环结构分为三类:while、loop、repeat。

在循环结构也需要用到循环控制,控制循环什么时候结束、什么时候继续。在MySQL中iterate的使用类似于Java中的continue,跳出本次循环,继续下一次的循环;而leave类似于Java中的break,跳出当前所在的循环。

2.2.1 while循环

语法:

-- 语法
[标签:] WHILE 循环条件 DO
    循环体;
END WHILE [标签];

简单示例:

-- 示例:批量插入,根据次数插入到admin表中多条记录
DELIMITER $
CREATE PROCEDURE pro_while1(IN cout INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	WHILE i<=count DO
		INSERT INTO admin(username,password) VALUES(CONCAT('Rose',i),'666');
		SET i=i+1;
	END WHILE;
END
DELIMITER ;
CALL pro_while1(100);

使用leave语句和iterate语句的简单使用示例:

-- 示例1:添加leave语句。批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	a:WHILE i<=insertCount DO
		INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
		IF i>=20 THEN LEAVE a;
		END IF;
		SET i=i+1;
	END WHILE a;
END $
CALL test_while1(100)$
 
-- 示例2:添加iterate语句。批量插入,根据次数插入到admin表中多条记录,只插入偶数次
CREATE PROCEDURE test_while1(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('xiaohua',i),'0000');
		
	END WHILE a;
END $
CALL test_while1(100)$

2.2.2 loop循环

语法:

-- 语法
[标签:] LOOP
	循环体;
END LOOP [标签];
-- 注释:可以用来模拟简单的死循环

2.2.3 repeat循环

语法:

[标签:] REPEAT
	循环体;
UNTIL 结束循环的条件;
END REPEAT [标签];