zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    2016"百度之星"
    ZOJ 3703 Happy Programming Contest(01背包的灵活运用)
    LA 3942 Remember the Word (Trie树)
    ZOJ 3700 Ever Dream(Vector)
    Hdoj 1686 Oulipo
    2017总结,2018计划
    Ubuntu16.04 + caffe-ssd + [CPU_ONLY] + KITTI 训练总结
    【转载】The Elements of Programming Style之代码风格金科玉律
    qt中setStyleSheet导致的内存泄漏
    【转】用枚举定义有意义的数组下标
  • 原文地址:https://www.cnblogs.com/clamp7724/p/11803969.html
Copyright © 2011-2022 走看看