文章目录
- 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 [标签];