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可以省略)
循环
- while:类似于java中的while循环
- repeat:类似于java中的do while循环
- 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 ;

浙公网安备 33010602011771号