本篇文章主要是对MySQL学习时的一些总结,作为学习笔记记录。
数据来源
数据部分来自于b站尚硅谷MySQL课程
流程控制结构
与C/C++中的流程控制结构类似,Mysql中也有流程控制结构,主要分为顺序结构、分支结构、循环结构。
分支结构
if函数
IF(CONDITION,expr1,expr2)
- if函数能够实现双分支
- 应用在begin end中或外面
case结构
CASE 变量或表达式
WHEN val1 THEN expr1;
WHEN val2 THEN expr2;
......
ELSE exprn;
END
或
CASE
WHEN condition1 THEN expr1;
WHEN condition2 THEN expr2;
......
ELSE exprn;
END
- 应用在begin end块中或外面
if结构
IF condition1 THEN expr1;
ELSEIF condition2 THEN expr2;
......
ELSE exprn;
END IF;
- 功能上有点类似于多重if
- 只能应用在begin end块中
主要操作
#案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
CREATE FUNCTION f1 (score INT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A' ;
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 ;
RETURN ch ;
END $
#调用
SELECT f1(85)$
#案例2:创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500
CREATE PROCEDURE p1 (IN sal DOUBLE)
BEGIN
IF sal < 2000 THEN DELETE FROM employees WHERE salary = sal ;
ELSEIF sal BETWEEN 2000 AND 5000 THEN UPDATE employees SET salary = salary + 1000 WHERE salary = sal ;
ELSE UPDATE employees SET salary = salary + 500 WHERE salary = sal ;
END IF ;
END $
#调用
call p1(8300)$
#案例3:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
CREATE FUNCTION f2(score INT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
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;
RETURN ch;
END $
#调用
SELECT f2(85)$
循环结构
- 循环结构主要分为while、loop、repeat等结构,也包括循环控制语句:
- iterate:类似于continue,结束本次循环,继续下一次循环
- leave:类似于break,跳出循环,结束当前所在的循环
while
[lable:] WHILE loop_condition DO
loop_body;
END WHILE [ lable ] ;
loop
[lable:] LOOP
loop_body;
END LOOP [ lable ] ;
使用loop可以模拟简单的死循环
repeat
[lable:] REPEAT
loop_body;
UNTIL loop_end_condition
END REPEAT [ lable ] ;
主要操作
没有添加循环控制语句
#案例:批量插入,根据次数插入到admin表中多条记录
CREATE PROCEDURE while_info (IN num INT)
BEGIN
DECLARE i INT DEFAULT 1 ;
WHILE i <= num DO
INSERT INTO admin(username,PASSWORD) VALUES(CONCAT('tom',i),'123');
SET i = i + 1;
END WHILE;
END $
#调用
CALL while_info (10) $
添加leave语句
#案例:批量插入,根据次数插入到admin表中多条记录,如果次数>5则停止
CREATE PROCEDURE leave_info (IN num INT)
BEGIN
DECLARE i INT DEFAULT 1 ;
a:WHILE i < num DO
INSERT INTO admin(username,PASSWORD) VALUES(CONCAT('tom',i),'123');
IF i >= 5 THEN LEAVE a;
END IF;
SET i = i + 1;
END WHILE a;
END $
#调用
CALL leave_info(10) $
添加iterate语句
#案例:批量插入,根据次数插入到admin表中多条记录,只插入奇数次
CREATE PROCEDURE ITERATE_info(IN num INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i <= num DO
SET i = i + 1;
IF MOD(i,2) = 0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,PASSWORD) VALUES(CONCAT('tom',i),'123');
END WHILE a;
END $
#调用
CALL iterate_info(10)$