MYSQL变量以及逻辑控制语句

变量

https://www.cnblogs.com/yangyongchao/p/12157310.html
http://itsoku.com/course/3/50

局部变量

mysql局部变量,只能用在begin/end语句块中,比如存储过程中的begin/end语句块。其作用域仅限于该语句块。
局部变量前面没有@符号。

-- declare语句专门用于定义局部变量,可以使用default来说明默认值
declare age int default 0;

-- 局部变量的赋值方式
/*方式1*/
set 局部变量名=值;
set 局部变量名:=值;
select 局部变量名:=值;
/*方式2*/
select 字段 into 局部变量名 from 表;

用户变量

mysql用户变量,mysql中用户变量不用提前申明,在用的时候直接用"@变量名"使用就可以了。其作用域为当前连接。

set @变量名=值;
set @变量名:=值;
select @变量名:=值;
select @变量名

select 字段 into @变量名 from 表;

会话变量

针对当前会话(连接)有效,不能跨连接。
会话变量是在连接创建时由mysql自动给当前会话设置的变量。

/*①查看所有会话变量*/
show session variables;
/*查看包含`char`字符变量名的会话变量*/
show session variables like '%char%';

/*③查看指定的会话变量的值*/
/*查看事务默认自动提交的设置*/
select @@autocommit;
select @@session.autocommit;
/*查看事务隔离级别*/
select @@tx_isolation;
select @@session.tx_isolation;

/*④为某个会话变量赋值*/
set @@session.tx_isolation='read-uncommitted';
set @@tx_isolation='read-committed';
set session tx_isolation='read-committed';
set tx_isolation='read-committed';

全局变量

mysql服务器每次启动都会为所有的系统变量设置初始值。
我们为系统变量赋值,针对所有会话(连接)有效,可以跨连接,但不能跨重启,重启之后,mysql服务器会再次为所有系统变量赋初始值。

流程控制

IF

if 条件语句1 then
    begin
     语句1;
    end;
elseif 条件语句2 then
    begin
     语句2;
    end;
else
    begin
     语句3;
    end;
end if;

CASE

case 表达式
when 值1 then 结果1或者语句1(如果是语句需要加分号)
when 值2 then 结果2或者语句2
...
else 结果n或者语句n
end [case] (如果是放在begin end之间需要加case,如果在select后则不需要)

/*删除存储过程proc1*/
DROP FUNCTION IF EXISTS fun1;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程proc1*/
CREATE FUNCTION fun1(sex TINYINT UNSIGNED)
  RETURNS varchar(8)
  BEGIN
    /*声明变量v_sex用于存放性别*/
    DECLARE v_sex VARCHAR(8);
    CASE sex
    WHEN 1 THEN
      SET v_sex:='男';
    ELSE
      SET v_sex:='女';
    END CASE;
    RETURN v_sex;
  END $
/*结束符置为;*/
DELIMITER ;

case
when 条件1 then 结果1或者语句1(如果是语句需要加分号)
when 条件2 then 结果2或者语句2
...
else 结果n或者语句n
end [case] (如果是放在begin end之间需要加case,如果是在select后面case可以省略)

循环

  1. while:类似于java中的while循环
  2. repeat:类似于java中的do while循环
  3. loop:类似于java中的while(true)死循环,需要在内部进行控制。

while

标签:是给while取个名字,标签和iterate、leave结合用于在循环内部对循环进行控制:如:跳出循环、结束本次循环。
注意:这个循环先判断条件,条件成立之后,才会执行循环体,每次执行都会先进行判断。

[标签:]while 循环条件 do
循环体
end while [标签];

/*删除test1表记录*/
DELETE FROM test1;
/*删除存储过程*/
DROP PROCEDURE IF EXISTS proc3;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程*/
CREATE PROCEDURE proc3(v_count int)
  BEGIN
    DECLARE i int DEFAULT 1;
    a:WHILE i<=v_count DO
      INSERT into test1 values (i);
      /*判断i=10,离开循环a*/
      IF i=10 THEN
        LEAVE a;
      END IF;
      /*判断i=1,跳出此次循环a*/
      IF i=1 THEN
        ITERATE a;
      END IF;
      /*流程控制*/
      SET i=i+1;
    END WHILE;
  END $
/*结束符置为;*/
DELIMITER ;

repeat

repeat循环类似于java中的do…while循环,不管如何,循环都会先执行一次,然后再判断结束循环的条件,不满足结束条件,循环体继续执行。这块和while不同,while是先判断条件是否成立再执行循环体。

[标签:]repeat
循环体;
until 结束循环的条件 end repeat [标签];
/*删除存储过程*/
DROP PROCEDURE IF EXISTS proc6;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程*/
CREATE PROCEDURE proc6(v_count int)
  BEGIN
    DECLARE i int DEFAULT 1;
    a:REPEAT
      INSERT into test1 values (i);
      SET i=i+1;
    UNTIL i>v_count END REPEAT;
  END $
/*结束符置为;*/
DELIMITER ;

loop

loop相当于一个死循环,需要在循环体中使用iterate或者leave来控制循环的执行。

[标签:]loop
循环体;
end loop [标签];
/*删除存储过程*/
DROP PROCEDURE IF EXISTS proc7;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程*/
CREATE PROCEDURE proc7(v_count int)
  BEGIN
    DECLARE i int DEFAULT 0;

    a:LOOP
      SET i=i+1;
      /*当i>v_count的时候退出循环*/
      IF i>v_count THEN
        LEAVE a;
      END IF;
      INSERT into test1 values (i);
    END LOOP a;

  END $
/*结束符置为;*/
DELIMITER ;
posted @ 2026-08-30 19:05  清哥的码农生活  阅读(2)  评论(0)    收藏  举报