美文网首页
mysql sql编程

mysql sql编程

作者: 尹楷楷 | 来源:发表于2020-05-08 15:45 被阅读0次

    mysql的sql编程一般使用在 存储过程/触发器/事件 等sql程序中。

    DECLARE 变量申明

    1、使用DECLARE 语句申明变量,而不是使用@x 形式的用户变量。因为用户变量的作用域为当前连接,范围比较大。而DECLARE 变量只在当前的BEGIN ... END复合语句里有效。

    CREATE DEFINER="root"@"%" PROCEDURE "test_1"()
    begin
        
            DECLARE a INT DEFAULT 1;
            DECLARE b INT DEFAULT 100;
            DECLARE i INT DEFAULT 0;
            
            WHILE i < 1000 DO
             SET a = a + b;
                     SET i = i + 1;
        END WHILE;
            SELECT a; 
            
    end
    

    2、使用unsigned关键字将变量申明为无符号。表示范围将扩大一倍

         -- 定义变量
        DECLARE i int unsigned DEFAULT 0;
    

    3、 变量名不能和列名一样。SELECT a INTO b FROM
    tb 会默认将a变量赋值给b变量,即使tb表中存在名字为b的列

    CREATE DEFINER="root"@"%" PROCEDURE "sp1"(x VARCHAR(5))
    BEGIN
        DECLARE xname VARCHAR(5) DEFAULT 'bob';
        DECLARE newname VARCHAR(5);
        
        SELECT xname INTO newname 
          FROM (SELECT 'yinkai' newname  ) tb WHERE xname = xname;
        SELECT newname;
      END
    

    最终SELECT newname;输出 'bob' 而不是我们希望的 'yinkai'

    变量赋值

    1、手动赋值 :使用 SET 命令

    2、在select查询参数中使用查询结果集赋值:
    使用 SELECT num字段 INTO rnum变量。例如下面存储过程的例子,tb表的a,b字段赋值到number1 、number2的字段当中了。而且这种SELECT .. INTO ..的方式不会产生结果集,适合使用在触发器里。

    CREATE DEFINER="root"@"%" PROCEDURE "test_1"()
    begin
        
            DECLARE number1 INT DEFAULT 0;
            DECLARE number2 INT DEFAULT 0;
            SELECT a,b INTO number1,number2 FROM (SELECT 1 a, 2 b ) tb;
            SELECT number1,number1;
            
    end
    

    流程控制

    if-else语句

    如下存储过程,展示了if-else语句的用法

    create procedure p_hello_world(in v_id int)
    begin
        if (v_id > 0) then
            select '> 0';
        elseif (v_id = 0) then
            select '= 0';
        else
            select '< 0';
        end if;
    end;
     
    call p_hello_world(-9);
    
    drop procedure if exists p_hello_world;
    
    循环

    1、while循环

    CREATE DEFINER="root"@"%" PROCEDURE "test_1"()
    begin
            DECLARE i INT DEFAULT 0;
            WHILE i < 10 DO
             
                     SET i = i + 1;
                     SELECT CONCAT('i==>',i) ; 
        END WHILE;
            
    end
    

    2、repeat循环
    类似于c语言中的 do while循环,先执行一次循环体再判断。

    CREATE DEFINER="root"@"%" PROCEDURE "test_1"()
    begin
        -- 定义变量
        DECLARE i int unsigned DEFAULT 0;
        REPEAT
            SET i = i+1;
            SELECT i;
        UNTIL i >= 10
        END REPEAT;
            
    end
    

    3、loop循环

    CREATE DEFINER="root"@"%" PROCEDURE "test_1"()
    begin
         -- 定义变量
        DECLARE i int unsigned DEFAULT 0;
        LOOP_LABEL:LOOP
            SELECT i;
            SET i = i+1;
            IF i >= 10 THEN
                LEAVE LOOP_LABEL;
            END IF;
        END LOOP;
            
    end
    
    case语句

    类似于java中的switch语句,传入一个值。根据它去执行不同的语句

    CREATE DEFINER="root"@"%" PROCEDURE "p4"(IN `age` int)
    BEGIN
       
         CASE age
         WHEN 1 THEN 
            select '我是1';
         WHEN 2 THEN
            select '我是2';
         WHEN 3 THEN
            select '我是3';
       ELSE 
            select '我不是任何1到3之间的数';
        END CASE ;
         
    END
    

    执行 CALL p4(1);

    相关文章

      网友评论

          本文标题:mysql sql编程

          本文链接:https://www.haomeiwen.com/subject/maqvghtx.html