mysql - 流程控制
顺序结构
分支结构
循环结构
分支结构:
1. if
if(表达式1,表达式2,表达式3)
如果:表达式1 = true,则执行表达式2;
如果:表达式1 = false,则执行表达式3;
SET @a = 2; SELECT IF(@a = 3,NAME,money) FROM account WHERE userid = 1;
if 条件
then 语句
else
语句
end if;
2.case
1.类似于switch case结构
case 变量(或表达式)
when 值1 then 语句;
when 值2 then 语句;
。。。
else 语句;
end case;
DELIMITER $$ CREATE PROCEDURE pro_test1(IN a INT) BEGIN SET @a = a; CASE @a WHEN 1 THEN SELECT 'A'; WHEN 2 THEN SELECT 'B'; WHEN 3 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; END $$ DELIMITER ; CALL pro_test1(2);
2.类似于if else结构
case
when 条件1 then 语句;
when 条件2 then 语句;
。。。
else 语句;
end case;
DELIMITER $$ CREATE PROCEDURE pro_test2(IN a INT) BEGIN SET @a = a; CASE WHEN @a = 1 THEN SELECT 'A'; WHEN @a = 2 THEN SELECT 'B'; WHEN @a = 3 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; END $$ DELIMITER ; CALL pro_test1(2);
else相当于java中的default,可以省略,如果都不符合返回null。
循环结构
while java中的while while 循环条件 do 语句; end while;
loop java中的while(true) 需要利用leave来停止
repeat java中的do while repeat 语句 until 停止条件 end repeat
interate java中的continue 跳过这次循环,进入下一次循环
leave java中的break 结束当前循环 最好后面加上循环的标识名字= =我的 sqlyog 不加循环名字会报错。。。
用循环做乘积
num1 个 num2 相加返回 result
1.while
DELIMITER $$ CREATE PROCEDURE pro_test_while(IN num1 INT, IN num2 INT, OUT result INT) BEGIN DECLARE i INT; SET i = 0; SET result = 0; WHILE i < num1 DO SET i = i + 1; SET result = result + num2; END WHILE; END $$ DELIMITER ; CALL pro_test_while(12,13,@re); SELECT @re;
2. loop
DELIMITER $$ CREATE PROCEDURE pro_test_loop(IN num1 INT, IN num2 INT, OUT result INT) BEGIN DECLARE i INT; SET i = 0; SET result = 0; l1: LOOP IF i = num1 THEN LEAVE l1; ELSE SET i = i + 1; SET result = result + num2; END IF; END LOOP l1; END $$ DELIMITER ; CALL pro_test_loop(12,13,@re); SELECT @re;
3.repeat
DELIMITER $$ CREATE PROCEDURE pro_test_repeat(IN num1 INT, IN num2 INT, OUT result INT) BEGIN DECLARE i INT; SET i = 0; SET result = 0; REPEAT SET i = i + 1; SET result = result + num2; UNTIL i = num1 END REPEAT; END $$ DELIMITER ; CALL pro_test_repeat(12,13,@re); SELECT @re;
游标:
类似于java中的指针 和 foreach(Object o: ArrayList<Object> arr) 中的o
DELIMITER $$ CREATE PROCEDURE pro_test_cursor(IN p_uid1 INT, IN p_uid2 INT, OUT p_result VARCHAR(400)) BEGIN DECLARE p_uid INT; DECLARE p_uname VARCHAR(20); DECLARE p_done INT DEFAULT 0; DECLARE p_c CURSOR FOR SELECT uid, username FROM userinfo; #定义游标c,c每次表示了查询结果中的一行结果。 DECLARE CONTINUE HANDLER FOR NOT FOUND SET p_done=1; SET p_result = 'aaa'; OPEN p_c; #打开游标 SELECT p_done, p_uid, p_uid1, p_uid2; #执行到这里时输出查询结果,可以用来调试bug l1: LOOP FETCH p_c INTO p_uid, p_uname; #把当前游标指向的这一条结果赋给变量进行处理,同时游标会挪到下一行。因此需要在这句执行完后判断done = 1,否则最后一条会多处理一遍。 #之前用uid作为变量名,发现会导致uid = null。可能不能和属性名一样。 IF p_done = 1 THEN LEAVE l1; END IF; #当done = 1时,说明已经找到了最后,直接leave #没有leave时,进行判断和处理 IF p_uid = p_uid1 OR p_uid = p_uid2 THEN SET p_result = CONCAT(p_result, '|', p_uname); END IF; END LOOP l1; CLOSE p_c; #关闭游标 END $$ DELIMITER ; CALL pro_test_cursor(2,8,@re); SELECT @re;