mysql - 流程控制

时间:2019-11-06
本文章向大家介绍mysql - 流程控制,主要包括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;

原文地址:https://www.cnblogs.com/clamp7724/p/11803969.html