在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终
的结果数据。
在 MySQL 数据库中,变量分为 系统变量 以及 用户自定义变量 。
系统变量
系统变量由系统定义,存储着一些对数据库操作的默认参数,定义了当前MySQL服务实例的属性、特征。比如创建数据库的默认字符集,表的默认存储引擎等。
在MySQL中有些系统变量只能是全局的,例如 max_connections 用于限制服务器的最大连接数;有些系统变量作用域既可以是全局又可以是会话,例如 character_set_client 用于设置客户端的字符集;有些系统变量的作用域只能是当前会话,例如 pseudo_thread_id 用于标记当前会话的 MySQL 连接 ID。
作为 MySQL 编码规范,MySQL 中的系统变量以 两个“@” 开头,其中“@@global”仅用于标记全局系统变量,“@@session”仅用于标记会话系统变量。“@@”首先标记会话系统变量,如果会话系统变量不存在,则标记全局系统变量。
全局系统变量
全局系统变量针对于所有会话(连接)有效,但不能跨重启 (MySQL8 做出了一些改变)。
会话系统变量
会话系统变量仅针对于当前会话(连接)有效。会话期间,当前会话对某个会话系统变量值的修改,不会影响其他会话同一个会话系统变量的值。
会话1对某个全局系统变量值的修改会导致会话2中同一个全局系统变量值的修改。
查看系统变量
#查看所有全局系统变量
show global variables;
#查看所有会话系统变量
show session variables;
或
SHOW VARIABLES;
#查看指定的全局系统变量的值
SELECT @@global.变量名;
#查看指定的会话系统变量的值
SELECT @@session.变量名;
#或者
SELECT @@变量名;
修改系统变量值
#为某个全局系统变量赋值
#方式1:
SET @@global.变量名=变量值;
#方式2:
SET GLOBAL 变量名=变量值;
#为某个会话系统变量赋值
#方式1:
SET @@session.变量名=变量值;
#方式2:
SET SESSION 变量名=变量值;
MySQL 8.0的新特性—全局变量的持久化
MySQL 8.0版本新增了 set persist
命令。
例如,设置服务器的最大连接数为1000:
SET PERSIST global max_connections = 1000;
用户变量
用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@” 开头。根据作用范围不同,又分为 会话用户变量 和 局部变量 。
- 会话用户变量:作用域和会话变量一样,只对 当前连接 会话有效。
- 局部变量:只在 begin和 end语句块中有效。局部变量只能在 存储过程和函数 中使用。
通常我们使用的都是会话用户变量,如果在存储过程或存储函数中才使用局部变量
会话用户变量
定义变量
#方式1:“=”或“:=” SET
@用户变量 = 值; SET @用户变量 := 值;
#方式2:“:=” 或 INTO关键字
SELECT @用户变量 := 表达式 [FROM 等子句];
SELECT 表达式 INTO @用户变量 [FROM 等子句];
PS: 注意=
和:=
的区别
=
只有在set语句中有赋值的作用,:=
只有赋值的作用。
局部变量
在存储函数、存储变量中使用!!
BEGIN
#声明局部变量
DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值];
DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值];
#为局部变量赋值
SET 变量名1 = 值; SELECT 值 INTO 变量名2 [FROM 子句];
#查看局部变量的值
SELECT 变量1,变量2,变量3;
END