变量
1.变量分类
1)系统变量
(1)全局系统变量global: 修改影响全局系统 show global variables like ‘变量名’;
(2)回话系统变量session:仅用于定义当前会话的客户机 show [session|local] variables [ like ‘变量名'];
2)只读状态变量分为全局级和会话级show status like
3)用户自定义变量
(1)用户会话变量(@开头)会话期间变量一直有效。不同会话之间不能相互访问
(2)局部变量(不以@开头)必须定义在存储程序中(函数、触发器、存储过程及事件),作用域仅限存储程序中
2.变量设置与定义
2.1设置全局系统变量:
2.2设置会话系统变量: set @@session.会话系统变量 = 值; set [session] 会话系统变量名 = 值;
2.3定义用户变量: set @变量1 = 值1, 变量2 = 值2…; #定义赋值
select @变量1 := 值1, 变量2 := 值2…; select 表 into @变量2, into @变量2…;
2.4定义局部变量:
存储程序begin...end中: declare 变量名 数据类型; #变量定义 set 变量名=值;select ...into变量名 ;#变量赋值
[|out|inout]
3.实例:
3.1查看系统变量的值:
#查看全局系统变量utf8
;#查看回话系统变量utf8
[ session/local ]
select@@global[|session].sort_buffer_size;
查看变量值方法2:从information_schema数据库里的global_variables和session_variables表获得
3.2修改系统变量的值:
set global[|session] var_name = value;
等价 set character_set_client = gbk;
3.3定义用户变量:
set @name = 'mysql'; #定义用户变量
select @age: = 18; #定义用户变量
select count(*) from goods into @goodsnum;#定义用户变量
select @goodsnum; #查看变量
3.4局部变量
delimiter $ # 重置命令结束标记
create procedure sub(in a int)
modifies sql data
begin
declare s1 int;
set a = 1;
select count(*) from goods into s1;
end$
4.用户定义变量说明
原则
不要在语句一个部分为变量分配一个值而在同一语句其它部分使用该变量。使用前将变量设置为0、""或''以定义其类型。
转换
未分配变量为字符串NULL;时间或空间数据转换二进制字符串。
json数据值将转换为字符集utf8mb4和排序规则的字符串 utf8mb4_bin
在结果集中选择了用户变量的值,则会将其作为字符串返回给客户端。
分配给变量十六进制或位值被视为二进制字符串。将十六进制或位值作为数字分配给用户变量,请在数字上下文中使用它。
例如,添加0或使用CAST(... AS UNSIGNED):
mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST(X'41' AS UNSIGNED);
mysql> SELECT @v1, @v2, @v3; #| A | 65 | 65 |
mysql> SET @v1 = b'1000001';
mysql> SET @v2 = b'1000001'+0;
mysql> SET @v3 = CAST(b'1000001' AS UNSIGNED);
mysql> SELECT @v1, @v2, @v3; #| A | 65 | 65 |
注意:
- 用户变量不包括明显需要文字值的上下文中,如select语句的limit子句或load data语句的IGNORE number LINES子句。
- SELECT语句中表达式发送到客户端后才进行计算。在HAVING、GROUP BY或者ORDER BY子句中,不能使用变量;
- 用户变量旨在提供数据值。不能直接在 SQL 语句中用作标识符或标识符的一部分
例如在需要表或数据库名称的上下文中,或作为保留字等select. 即使引用变量也不能正确显示:
SELECT c1 FROM tb_name;
SET @col = "`c1`";
SELECT @col FROM tb_name;
4.例外当您构造一个字符串以用作稍后执行的预准备语句时,用户变量可用于提供语句的任何部分。::
实例1:
SET @c = "name";
SET @s = CONCAT("SELECT ", @c, " FROM m1801");
prepare sub from @s;
execute sub; # EXECUTE
deallocate prepare sub; #DEALLOCATE PREPARE
实例2:
#select if ( @a,@a:=@a + 1, @a:= 1)-1 as rownum ;
#select @a,rownum,@a;
set @counter = 0 ;#查询表中No号为偶数的数据
select *,@counter from m1801 having(@counter:= @counter+1)%2= 0 order by no;
实例3:
";#查找表m1801中name= Tom的所有结果
SELECT name,open FROM m1801 WHERE m1801.name LIKE CONCAT("%",@n,"%");