顺序结构java
分支结构sql
循环结构oop
分支结构:ui
1. if spa
if(表达式1,表达式2,表达式3)指针
若是:表达式1 = true,则执行表达式2;调试
若是:表达式1 = false,则执行表达式3;code
SET @a = 2; SELECT IF(@a = 3,NAME,money) FROM account WHERE userid = 1;
if 条件blog
then 语句it
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;