【第二十部分】系统变量和用户变量

  • Post author:
  • Post category:其他




【第二十部分】系统变量和用户变量





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 =;
	SELECTINTO 变量名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



总结

以上就是今天要讲的内容,希望对大家有所帮助!!!



版权声明:本文为Trees__原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。