一、系统变量
1、系统变量分类
- 1、系统变量由系统定义,不是用户定义,属于
服务器
层面。启动 MySQL 服务,生成 MySQL 服务实例期间,MySQL 将为 MySQL 服务器内存中的系统变量赋值,这些系统变量定义了当前 MySQL 服务实例的属性、特征。这些系统变量的值要么是编译MySQL时参数
的默认值,要么是配置文件
(如:my.ini 等)中的参数值 - 2、系统变量分为全局系统变量(需要添加
global
关键字)以及绘话系统变量(需要添加session
关键字),有时也把全局系统变量简称为全局变量
,有时也把会话系统变量称为local变量
。如果不写,默认会话级别
。静态变量(在MySQL服务实例运行期间他们的值不能使用 set 动态修改)属于特殊的全局系统变量 -
3、每个MySQL客户机成功连接MySQL服务器后,都会产生与之对应的会话。会话期间,MySQL服务实例会在MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系统变量值的复制。
image.png
- 4、全局系统变量针对所有会话(连接)有效,但不能跨重启
- 5、会话系统变量仅针对于当前会话(连接)有效。会话期间,当前会话对某个会话系统变量值的修
改,不会影响其他会话同一个会话系统变量的值 - 6、会话1对某个全局系统变量值的修改会导致会话2中同一个全局系统变量值的修改
- 在MySQL中有些系统变量只能是全局的,例如 max_connections 用于限制服务器的最大连接数;有些系
统变量作用域既可以是全局又可以是会话,例如 character_set_client 用于设置客户端的字符集;有些系
统变量的作用域只能是当前会话,例如 pseudo_thread_id 用于标记当前会话的 MySQL 连接 ID
2、查看系统变量
- 1、查看所有全局变量
SHOW GLOBAL VARIABLES;
- 2、查看所有会话变量
SHOW SESSION VARIABLES ;
或
SHOW VARIABLES ;
- 3、带条件搜索变量
SHOW GLOBAL VARIABLES LIKE 'admin_%';
3、查看指定系统变量
MySQL 编码规范,MySQL 中的系统变量以
两个@
开头:
1、“@@global”仅用于标记全局系统变量
2、“@@session”仅用于标记会话系统变量
3、“@@”首先标记会话系统变量,如果会话系统变量不存在,则标记全局系统变量
SELECT @@global.admin_port;
SELECT @@session.变量名;
SELECT @@变量名;
SELECT @@admin_port
4、修改系统变量的值
有些时候,数据库管理员需要修改系统变量的默认值,以便修改当前会话或者MySQL服务实例的属性、
特征。具体方法
方式1:修改MySQL 配置文件 ,继而修改MySQL系统变量的值(该方法需要重启MySQL服务)
方式2:在MySQL服务运行期间,使用“set”命令重新设置系统变量的值
#为某个系统变量赋值
#方式1:
SET @@global.变量名=变量值;
#方式2:
SET GLOBAL 变量名=变量值;
#为某个会话变量赋值
#方式1:
SET @@session.变量名=变量值;
#方式2:
SET SESSION 变量名=变量值;
SELECT @@global.autocommit;
SET GLOBAL autocommit=0;
SELECT @@session.tx_isolation;
SET @@session.tx_isolation='read-uncommitted';
SET GLOBAL max_connections = 1000;
SELECT @@global.max_connections;
二、用户变量
用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@” 开头。根据作用
范围不同,又分为 会话用户变量 和 局部变量 。
1、会话用户变量:作用域和会话变量一样,只对 当前连接 会话有效。
2、局部变量:只在 BEGIN 和 END 语句块中有效。局部变量只能在 存储过程和函数 中使用。
1、会话用户变量
- 定义
#方式1:“=”或“:=”
SET @用户变量 = 值;
SET @用户变量 := 值;
#方式2:“:=” 或 INTO关键字
SELECT @用户变量 := 表达式 [FROM 等子句];
SELECT 表达式 INTO @用户变量 [FROM 等子句];
- 举例
SET @a = 1;
SELECT @a;
SELECT @num := COUNT(*) FROM employees;
SELECT @num;
SELECT AVG(salary) INTO @avgsalary FROM employees;
SELECT @avgsalary;
SELECT @big; #查看某个未声明的变量时,将得到NULL值
2、局部变量
- 定义:使用
DECLARE
语句定义一个局部变量 - 作用域:仅仅在定义它的
BEGIN ... END
中有效 - 位置:只能放在
BEGIN ... END
中,而且只能放在第一句
DELIMITER $
CREATE PROCEDURE test()
BEGIN
# 声明局部变量
DECLARE age INT DEFAULT 1;
DECLARE salary DOUBLE DEFAULT 0;
# 局部变量赋值
SET age = 10;
SET salary = 100;
SELECT age, salary;
END $
DELIMITER ;
- 变量赋值
方式1:一般用于赋简单的值
SET 变量名=值;
SET 变量名:=值;
方式2:一般用于赋表中的字段值
SELECT 字段名或表达式 INTO 变量名 FROM 表;
- 使用变量
SELECT 局部变量名
三、实战
实战1、声明局部变量,并分别赋值为employees表中employee_id为102的last_name和salary
DELIMITER $
CREATE PROCEDURE fetch_employee_info_by_eid(IN emp_id INT)
BEGIN
DECLARE _name VARCHAR(25);
DECLARE _salary DOUBLE;
SELECT name INTO _name FROM emp WHERE id = emp_id;
SELECT salary INTO _salary FROM emp WHERE id = emp_id;
# SELECT salary INTO _salary, salary INTO _salary FROM emp WHERE id = emp_id;
SELECT _name, _salary;
END $
DELIMITER ;
- 调用
CALL fetch_employee_info_by_eid(101);
实战2:创建存储过程“different_salary”查询某员工和他领导的薪资差距,并用IN参数emp_id接收员工id,用OUT参数dif_salary输出薪资差距结果
DELIMITER $
CREATE PROCEDURE different_salary(IN emp_id INT, OUT dif_salary DOUBLE)
BEGIN
DECLARE self_salary, mgr_salary DOUBLE DEFAULT 0;
SELECT salary INTO self_salary FROM employees WHERE employee_id = emp_id;
SELECT mgr.salary
INTO mgr_salary
FROM employees mgr
JOIN employees emp
ON mgr.employee_id = emp.manager_id
WHERE emp.employee_id = emp_id;
SET dif_salary = mgr_salary - self_salary;
END $
DELIMITER ;
- 调用
SET @id = 101;
SET @salary = 0;
CALL different_salary(@id, @salary);
- 查看
SELECT @salary;
网友评论