【第二十部分】系统变量和用户变量
文章目录
20. 系统变量和用户变量
20.1 系统变量
系统变量分为全局系统变量和会话系统变量
全局系统变量: 针对所有的会话连接有效,如果重启MySQL服务器则会失效
会话系统变量: 针对于当前会话连接有效,关闭当前会话即失效; 在会话期间, 当前会话对某个会话系统变量值的修改,不会影响其他会话同一个会话系统变量的值, 但是如果会话对某个全局系统变量修改,那么会导致其他会话中同一个全局系统变量值的修改
在MySQL中,系统变量有的是全局,有的是会话,有的既可以是会话也可以是全局,就像一个交集.
查看系统变量
# 查看所有全局变量
SHOW GLOBAL VARIABLES;
# 查看所有会话变量
SHOW SESSION VARIABLES;
# 查看满足条件的部分系统变量。
SHOW GLOBAL VARIABLES LIKE '%xxx%';
# 查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%xxx%';
查看指定的系统变量
# 系统变量以两个@@开头
# 查看指定的系统变量的值
SELECT @@global.变量名;
# 查看指定的会话变量的值
SELECT @@session.变量名;
修改系统变量值
#为某个系统变量赋值
#方式1:
SET @@global.变量名=变量值;
#方式2:
SET GLOBAL 变量名=变量值;
#为某个会话变量赋值
#方式1:
SET @@session.变量名=变量值;
#方式2:
SET SESSION 变量名=变量值;
20.2 用户变量
MySQL 中的用户变量以一个“@”
开头。根据作用范围不同,又分为会话用户变量
和局部变量
。
会话用户变量: 也是只针对当前的会话,即会话关闭即失效
局部变量: 只能使用在存储函数和存储过程中,也就是BEGIN和END语句块中有效
会话用户变量的定义
#方式1:“=”或“:=”
SET @用户变量 = 值;
SET @用户变量 := 值;
#方式2:“:=” 或 INTO关键字
SELECT @用户变量 := 表达式 [FROM 等子句];
SELECT 表达式 INTO @用户变量 [FROM 等子句];
使用会话用户变量
# 示例一
SET @a = 1;
SET @b := 2;
SET @total = @a + @b;
SELECT @total
# 示例二
# 这里注意要用 := 不然赋值不了
SELECT @num := COUNT(*)
FROM employees
SET @num2 = 0
SELECT COUNT(*) INTO @num2
FROM employees
SELECT @num2
局部变量的定义
# DECLARE去定义一个局部变量,并且需要放在第一句
BEGIN
#声明局部变量
DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值];
DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值];
#为局部变量赋值
SET 变量名1 = 值;
SELECT 值 INTO 变量名2 [FROM 子句];
#查看局部变量的值
SELECT 变量1,变量2,变量3;
END
局部变量的使用
# 创建存储过程“different_salary”查询某员工和他领导的薪资差距,并用IN参数emp_id接收员工id,用OUT参数dif_salary输出薪资差距结果
# 注意加; 否则报错
DELIMITER //
CREATE PROCEDURE different_salary(IN emp_id INT,OUT dif_salary DOUBLE(8,2))
BEGIN
# 声明局部变量
DECLARE emp_sal DOUBLE(8,2) DEFAULT 0.0 ;
DECLARE mrg_sal DOUBLE(8,2) DEFAULT 0.0 ;
SELECT salary INTO emp_sal
FROM employees
WHERE employee_id = emp_id;
SELECT salary INTO mrg_sal
FROM employees
WHERE employee_id = (
SELECT manager_id
FROM employees
WHERE employee_id = emp_id
);
SET dif_salary = mrg_sal - emp_sal;
END //
DELIMITER;
SET @emp_id = 105
CALL different_salary(@emp_id,@dif_salary)
SELECT @dif_salary
总结
以上就是今天要讲的内容,希望对大家有所帮助!!!