1. 分类
- 系统变量
- 全局变量
- 会话变量
- 自定义变量
- 用户变量
- 局部变量
2. 系统变量
2.1 全局变量
作用域:针对于所有会话(连接)有效,但不能跨重启
# 查看所有全局变量
SHOW GLOBAL VARIABLES;
# 查看满足条件的部分系统变量
SHOW GLOBAL VARIABLES LIKE '%char%';
# 查看指定的系统变量的值
SELECT @@global.autocommit;
# 为某个系统变量赋值
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;
2.2 会话变量
作用域:针对于当前会话(连接)有效
# 查看所有会话变量
SHOW SESSION VARIABLES;
# 查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%char%';
# 查看指定的会话变量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
# 为某个会话变量赋值
SET @@session.tx_isolation='read-uncommitted';
SET SESSION tx_isolation='read-committed';
3. 自定义变量
3.1 用户变量
- 作用域:针对当前会话或者连接有效,与会话变量作用域相同
- 语法
# 声明并初始化
SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值;
# 赋值
# 方式一:一般用于赋简单的值
SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值;
# 方式二:一般用于赋表中的字段值
SELECT 字段名或表达式 INTO @变量名 FROM 表;
SELECT @变量名:=字段名或表达式 FROM 表;
# 使用(输出)
select @变量名;
- 示例
# 定义的变量是弱类型
set @name ='abc';
set @name = 100;
# 赋值并使用
set @a=1;
set @b=2;
set @c=@a+@b;
select @c;
# dept表
id dname
------ --------
1 dep1
2 dep2
3 dep3
# 这种方法只会赋值,并不会输出,需要显式SELECT
SELECT COUNT(dname) INTO @d FROM dept;
SELECT @d;
@d
------
3
# 这种方法会赋值,并输出
SELECT @c:= COUNT(dname) FROM dept
@c:= COUNT(dname)
-----------------
3
3.2 局部变量
- 作用域:仅仅在定义它的BEGIN END中有效
- 语法
# 声明
declare 变量名 类型 【default 值】;
# 赋值
# 方式一:一般用于赋简单的值
SET 变量名=值;
SET 变量名:=值;
SELECT 变量名:=值;
# 方式二:一般用于赋表 中的字段值
SELECT 字段名或表达式 INTO 变量名 FROM 表;
SELECT 变量名:=字段名或表达式 FROM 表;
# 使用
select 变量名
- 示例
DECLARE ans INT DEFAULT NULL;
SET ans=2;
3.3 比较
分类 | 作用域 | 定义位置 | 语法 |
---|---|---|---|
用户变量 | 当前会话 | 会话的任何地方 | 加@符号,不用指定类型 |
局部变量 | 定义它的BEGIN END中 | BEGIN END的第一句话 | 一般不用加@,需要指定类型 |