前言
变量是一个程序语言必不可少的一部分,sql也不例外,在sql中变量可以分为两种,系统变量和自定义变量。
系统变量
系统变量主要是指变量是由服务端来提供,不是用户自定义的。
系统变量根据范围分为全局级别和会话级别,它们只是范围的区别,变量都是一样的意思,所以下面的查看和修改系统变量的时候需要加上范围,如:
全局级别,需要加上GLOBAL
,会话级别需要加上SESSION
,如果不写默认是SESSION。
1 查看
1.1 查看全部系统变量
SHOW GLOBAL|[SESSION] VARIABLES;
1.2 查看满足条件的系统变量
# SHOW GLOBAL|[SESSION] VARIABLES LIKE '%条件%';
SHOW VARIABLES LIKE '%C_AR%'; # 查看当前会话编码格式
1.3 查看指定某个系统变量的值
# SELECT @@GLOBAL|SESSION.系统变量名
SELECT @@GLOBAL.character_set_client;
2 赋值
2.1 为某个系统变量赋值
# SET GLOBAL|SESSION 系统变量名 = 值;
SET SESSION character_set_client='utf8';
# SET @@GLOBAL|SESSION.系统变量名 = 值;
SET @@SESSION.character_set_client='binary';
如果修改的是会话变量,那么这次修改仅仅支持当前会话有效,如果在其他会话的话,依然是未修改的值。
用户自定义变量
用户自定义变量是由用户自己定义的,而不是上面的直接由系统提供的,由此除了上面的查看和赋值以外还包括了声明。
用户自定义变量也可以根据范围分为用户变量和局部变量
- 用户变量: 针对于当前会话有效,类似于上面的会话变量;
- **局部变量:**仅仅在
BENGIN
、END
存储结构中有效,也必须在BENGIN
、END
存储结构中第一句进行声明;
1 用户变量
声明并初始化
用户变量必须在声明的时候进行初始化,因此这两个可以看成是一体的。
SET @用户变量名=值;
SET @用户变量名:=值;
SELECT @用户变量名:=值;
更新变量
可以使用上面声明并初始化的语法来更新变量,当然也可以使用下面的语句来更新变量
SELECT 字段 INTO @变量名
FROM 表名;
这个语句必须保证查询的字段是单一的一列,并且只有一个元素。
使用变量(查看、运算)
SELECT @变量名;
例子:
SELECT @data_ne:=50; # 声明变量
SELECT @data_ne; # 查看变量
SELECT age INTO @data_ne
FROM grade_new_9
WHERE ID=1; # 更新变量
INSERT INTO `grade_new_9` (`id`,`seat`,`age`)VALUES(@data_ne+1,@data_ne+2,@data_ne); # 使用变量
2 局部变量
局部变量用在BEGIN
、END
存储结构中变量,只可以在这里使用,并且只可以在第一句就开始声明,作用域自然也是在一个存储结构中了,这点就和用户变量不同了,用户变量可以在任何地方使用。它同样是有声明、赋值以及使用
声明
和用户变量不同的是,局部变量不是一定需要在声明的时候赋值,可以在后面再此进行赋值;
DECLARE 变量名 类型; # 声明
DECLARE 变量名 类型 DEFAULT 值; # 声明并赋值
这里的类型就是mysql的基本数据类型。
赋值
SET 局部变量名=值;
SET 局部变量名:=值;
SELECT @局部变量名:=值;
SELECT 字段 INTO @局部变量名
FROM 表名;
使用
SELECT 局部变量名;
例子
可以看出来用户变量和局部变量在声明、赋值和使用上还是有一些不同的。
如这里写一个简单的存储结构来测试局部变量
DELIMITER $$ # 定义结束符,默认结束符是分号
CREATE PROCEDURE `simple_pro`() # 创建一个存储过程来测试局部变量
BEGIN
DECLARE a INT;
DECLARE b INT DEFAULT 5;
SET a:=b*b;
SELECT a,b;
END $$
CALL `simple_pro`()$$
结语
这样简单的变量就结束了,其实类似于java中变量,是一个存储临时值的单元,可以取用和修改。