• mysql的学习笔记-控制与循环结构


    1、分界符delimiter+procedure+begin end

    BEGIN ... END复合语句:包含多个语句。statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。

    [begin_label:] BEGIN
    语句群
    END [end_label]

    默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束, 
    那么回车后,mysql将会执行该命令。如输入下面的语句 
    mysql> select * from test; 
    然后回车,那么MySQL将立即执行该语句。 
    但有时候,不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。 

    默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。 
    因为mysql一遇到分号,它就要自动执行。 
    即,在语句RETURN ”;时,mysql解释器就要执行了。 
    这种情况下,就需要事先把delimiter换成其它符号,如//或$$。

    drop PROCEDURE if exists test_if; -- 删除
    delimiter // -- 更改分界符  
    create procedure test_if(in x int) 
    
    BEGIN
    INSERT INTO emp VALUES (11,'研发中心1',10,3000);
    INSERT INTO emp VALUES (12,'研发中心2',20,7000);
    INSERT INTO emp VALUES (13,'研发中心3',30,8000);
    SELECT * FROM emp;
    END;
    //
    delimiter ;  -- 还原分节符为;
    call test_if(0); -- 调用存储过程

    2、CASE分支

    case语法格式:

    CASE [条件]
    WHEN 条件1 THEN 语句1
    WHEN 条件2 THEN 语句2  

    ......
    ELSE 语句n
    END CASE

    执行案例:

    SELECT CASE sal WHEN '3000' THEN '低工资' WHEN  '8000' THEN '高工资' ELSE '普通工资' END AS 薪水 FROM emp;  -- case后面加sal,与下面的不同,注意比较
    select ename '姓名', deptno '部门编号' ,case -- case后面没有加sal,加了sal直接会走else语句
     when sal<'4000'   then  '低工资'   
     when sal<'7000'   then  '普通工资' 
     when sal<'8000'   then  '中等工资' 
    ELSE '高工资'
    end  '薪水'  
    from emp;

    3、变量

    SELECT @A:=SUM(deptno) FROM emp;
    UPDATE emp SET deptno=@A WHERE deptno=10;

    4、if .. then .. elseif .. then.. else..end if

    if语法格式:

    -- if语句格式
    if condition then
    ...
    [elseif condition then]
    ...
    [else]
    ...
    end if

    执行案例:

    drop procedure if exists testtt_if;
    delimiter // -- 分界符
    create procedure testtt_if(in x int)
    begin
    if x=1 then
    INSERT INTO emp VALUES (16,'研发中心1',10,3000);
    elseif x=0 then
    INSERT INTO emp VALUES (17,'研发中心2',20,7000);
    else 
    INSERT INTO emp VALUES (18,'研发中心3',30,80000);
    end if;
    end
    //
    delimiter ;
    call testtt_if(2);

    -- if(expr1,expr2,expr3)
    -- 如果expr1是True(expr1<>0 and expr1<>NULL),则IF()的返回值为expr2,否则返回值则为expr3.

    -- if(expr1,expr2,expr3) 
    -- 如果expr1是True(expr1<>0 and expr1<>NULL),则IF()的返回值为expr2,否则返回值则为expr3.
    select ename '姓名', deptno '部门编号' ,`IF`(sal<'4000','低工资',`IF`(sal<'7000','普通工资' ,`IF`(sal<'8000','中等工资', '高工资'))) from emp;
    
    select ename '姓名', deptno '部门编号' ,`IF`(sal<'4000','低工资','高工资') from emp;

    报[Err] 1370 - execute command denied to user '***'@'****' for routine 'test.IF' 错误

    解决方法:https://stackoverflow.com/questions/6434573/mysql-execute-command-denied-to-user-localhost-for-routine-error  

    root登录赋值权限,使权限生效

    1. log in as root
    2. GRANT EXECUTE ON PROCEDURE TestMediaControl.monthavrage TO '***'@'****' 
    3. flush privileges 

    5、while .. do ..end while

    语法格式:

    while condition do
    ...
    end while

    执行案例:

    DROP PROCEDURE IF EXISTS test_while;
    delimiter //  -- 无分号
    CREATE PROCEDURE test_while (OUT s INT)  -- 无分号
    BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE sum INT DEFAULT 8000;
    WHILE i <10 DO SET i = i +1; -- 有分号 SET sum = sum + 100*i; INSERT INTO emp VALUES (i,'研发中心2',20,sum);
    END WHILE; -- 有分号

    SET s=sum; END; // delimiter ; call test_while(@s);

    6、loop循环

    loop语法:该循环没有内置循环条件,但可以通过leave 语句退出循环。如下:

    loop_lable:loop
    if 条件 then leave loop_lable;
    end if;
    end loop;

    执行案例:

    DROP PROCEDURE IF EXISTS test_loop;
    delimiter //
    CREATE PROCEDURE test_loop(OUT s INT)
    BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE sum INT DEFAULT 8001;
    loop_lable:LOOP
    SET i=i+1; SET sum = sum + 100*i; INSERT INTO emp VALUES (i,'研发中心5',20,sum); if i>10 THEN LEAVE loop_lable; END IF; END LOOP;
    SET s = sum; END; // delimiter ; CALL test_loop(@sum);

    7、repeat循环

    该语句执行一次循环体,之后判断condition条件是否为真,为真则退出循环,否则继续执行循环体。repeat语句的表示形式如下。

    repeat
    ...
    until condition
    end repeat
    DROP PROCEDURE IF EXISTS test_repeat;
    delimiter //
    CREATE PROCEDURE test_repeat(OUT s INT)
    BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE sum INT DEFAULT 8002;
    
    REPEAT 
    SET i = i+1;
    SET sum = sum + 100*i;
    INSERT INTO emp VALUES (i,'研发中心5',20,sum);
    UNTIL i >10  -- 此处不能有分号
    END REPEAT;
    
    SET s= sum;
    END;
    
    //
    delimiter ;
    CALL test_repeat(@s);

    8、ITERATE 再次循环 与 LEAVE 

    ITERATE 语句:  ITERATE只可以出现在LOOP, REPEAT, 和WHILE语句内。ITERATE意思为:“再次循环。”   会再次回到label开始位置

    ITERATE 标签

    LEAVE语句:这个语句被用来退出任何被标注的流程控制构造。它和BEGIN ... END或循环一起被使用。  像其他语言中的break
    LEAVE 标签

  • 相关阅读:
    ORM&MySQL
    Python的内存管理机制
    Docker
    MySQL数据库优化
    Django&Flask区别
    Nginx
    JWT
    云接入特别说明
    gogs私有代码库上传项目
    Authentication failed (rejected by the remote node), please check the Erlang cookie
  • 原文地址:https://www.cnblogs.com/shishibuwan/p/10913582.html
Copyright © 2020-2023  润新知