文章目录
- 变量和配置文件
- 1. 变量
- 1.1 系统变量
- 1.1.1 系统变量分类
- 1.1.2 查看系统变量
- 1.1.3 修改系统变量的值
- 1.2 用户变量
- 1.2.1 用户变量分类
- 1.2.2 会话用户变量
- 1.2.3 局部变量
- 1.2.4 会话用户变量月局部变量对比
- 2. 配置文件的使用
- 2.1 配置文件格式
- 2.2 启动命令与选项组
- 2.3 特定的MYSQL版本的专用选项组
- 2.4 同一个配置文件中多个组的优先级
- 2.5 命令行和配置文件中启动选项的区别
变量和配置文件
1. 变量
在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据
,或者输出最终的结果数据。
在 MySQL 数据库中,变量分为 系统变量
以及 用户自定义变量
。
- 系统变量分为:
全局系统变量
和会话系统变量
- 用户自定义变量分为:
会话用户变量
和局部变量
1.1 系统变量
1.1.1 系统变量分类
变量由系统定义,不是用户定义,属于服务器层面
。
启动MySQL服务,生成MySQL服务实例期间,MySQL将为MySQL服务器内存中的系统变量赋值,这些系统变量定义了当前MySQL服务实例的属性、特征。这些系统变量的值要么是 编译MySQL时参数 的默认值,要么是 配置文件 (例如my.ini等)中的参数值。
-
系统变量分为
全局系统变量
(需要添加global
关键字)以及会话系统变量
(需要添加session
关键字),有时也把全局系统变量简称为全局变量,有时也把会话系统变量称为local变量。如果不写,默认会话级别。静态变量(在 MySQL 服务实例运行期间它们的值不能使用 set 动态修改)属于特殊的全局系统变量。 -
每一个MySQL客户机成功连接MySQL服务器后,都会产生与之对应的会话。会话期间,MySQL服务实例会在MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系统变量值的复制。如下图:
-
每建立一个连接就会产生一个会话,在会话内修改会话系统变量不会影响全局系统变量。
-
不同会话之前修改会话系统变量不会影响其他会话
,各个会话之间是隔离的。
- 全局系统变量针对于所有会话(连接)有效,但
不能跨重启
- 会话1对某个
全局系统变量值
的修改会导致会话2中同一个全局系统变量值的修改
在MySQL中有些系统变量只能是全局的,例如 max_connections
用于限制服务器的最大连接数;
有些系统变量作用域既可以是全局又可以是会话,例如 character_set_client
用于设置客户端的字符集;
有些系统变量的作用域只能是当前会话,例如 pseudo_thread_id
用于标记当前会话的 MySQL 连接 ID。
1.1.2 查看系统变量
-
MYSQL8.0和5.0变量个数也不同,我安装的是8.0版本,查询结果如下
#查看所有全局变量 500个 SHOW GLOBAL VARIABLES; #查看所有会话变量 500个 SHOW SESSION VARIABLES; # 默认查询会话系统变量 SHOW VARIABLES;
-
查看满足条件的部分系统变量
#查看满足条件的部分系统变量。 SHOW GLOBAL VARIABLES LIKE '%标识符%'; SHOW GLOBAL VARIABLES LIKE 'admin_%';#查看满足条件的部分会话变量 SHOW SESSION VARIABLES LIKE '%标识符%'; SHOW SESSION VARIABLES LIKE 'binlog_%';
-
查看指定系统变量
#查看指定的系统变量的值 SELECT @@global.变量名; #查看指定的会话变量的值 SELECT @@session.变量名; #或者 SELECT @@变量名;
1.1.3 修改系统变量的值
有些时候,数据库管理员需要修改系统变量的默认值,以便修改当前会话或者MySQL服务实例的属性、特征。具体方法:
-
方式1:修改MySQL 配置文件 ,继而修改MySQL系统变量的值(该方法需要
重启MySQL服务
) -
方式2:在MySQL服务运行期间,使用
“set”
命令重新设置系统变量的值只针对当前数据库实例生效,一旦
重启mysql服务,就失效
了。SET @@global.变量名=变量值; #方式2: SET GLOBAL 变量名=变量值; #为某个会话变量赋值 #方式1: SET @@session.变量名=变量值; #方式2: SET SESSION 变量名=变量值;
例:
# 方式1:SET方式修改系统变量的值 原来是151 SET @@global.max_connections = 151; SELECT @@global.max_connections; #方式2:SET方式修改系统变量的值 原来是151 SET GLOBAL max_connections = 171; SELECT @@global.max_connections;
1.2 用户变量
1.2.1 用户变量分类
用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@”
开头。
根据作用范围不同,又分为 会话用户变量
和 局部变量
。
-
会话用户变量:作用域和会话变量一样,只对
当前连接会话有效
,以 一个“@”
开头。 -
局部变量:
只在 BEGIN 和 END 语句块中有效
。局部变量只能在存储过程和函数 中使用。
1.2.2 会话用户变量
-
变量的定义:在连接保持的情况下,定义的变量一直是存在的,没有从内存中消失
#方式1:“=”或“:=” SET @用户变量 = 值; SET @用户变量 := 值; #方式2:“:=” 或 INTO关键字 SELECT @用户变量 := 表达式 [FROM 等子句]; SELECT 表达式 INTO @用户变量 [FROM 等子句];
-
查看用户变量的值:
SELECT @用户变量
-
例:方式1:
“=”或“:=”
定义并查看用户变量 -
方式2:
“:=”
或 INTO关键字SELECT @a; SELECT @num := COUNT(*) FROM employees; SELECT @num; SELECT AVG(salary) INTO @avgsalary FROM employees; SELECT @avgsalary; SELECT @big; #查看某个未声明的变量时,将得到NULL值
1.2.3 局部变量
定义:可以使用 DECLARE
语句定义一个局部变量
-
必须使用DECLARE声明
-
作用域:仅仅在定义它的
BEGIN ... END
中有效 -
位置:只能放在
BEGIN ... END
中,而且只能放在首行 -
必须在
DELIMTER
存储过程和存储函数中BEGIN #声明局部变量 DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值]; DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值]; #为局部变量赋值 SET 变量名1 = 值; SELECT 值 INTO 变量名2 [FROM 子句]; #查看局部变量的值 SELECT 变量1,变量2,变量3; END
-
例1:局部变量创建与使用
# 申明局部变量 DELIMITER // CREATE PROCEDURE test_var() BEGIN# 声明局部变量declare a int default 0;declare b int; # declare a, b int default 0;declare test_name varchar(25);# 赋值set a = 1;set b := 2;select name into test_name from test where id = 1;# 使用select a, b, test_name; end // DELIMITER ;# 调用存储过程 CALL test_var();
-
例2:
DELIMITER // CREATE PROCEDURE test_pro() BEGIN # 声明局部变量DECLARE temp_name VARCHAR(25);DECLARE sal DOUBLE(10, 2) DEFAULT 0.0; # 赋值SELECT name INTO temp_name FROM test;SET sal = 1000.0; # 使用SELECT temp_name, sal; end // DELIMITER ;# 调用存储过程 CALL test_pro();
-
例3:声明两个变量,求和并打印 (分别使用会话用户变量、局部变量的方式实现)
-
方式1:使用会话用户变量
# 使用会话用户变量 SET @V1 = 10; SET @V2 = 20; SET @result := @V1 + @V2; SELECT @result;
-
方式2:使用局部变量方式
# 使用局部变量的方式 DELIMITER // CREATE PROCEDURE add_value() BEGIN # 申明DECLARE value1, value2, sum_val INT; # 赋值SET value1 = 10;SET value2 := 20;SET sum_val = value1 + value2; # 使用SELECT sum_val; end // DELIMITER ; # 调用存储过程 CALL add_value();
-
-
例4:创建存储过程“different_salary”查询某员工和他领导的薪资差距,并用IN参数emp_id接收员工id,用OUT参数dif_salary输出薪资差距结果。
# 举例3:创建存储过程“different_salary”查询某员工和他领导的薪资差距,并用IN参数emp_id接收员工id,用OUT参数dif_salary输出薪资差距结果。 #声明 DELIMITER // CREATE PROCEDURE different_salary(IN emp_id INT,OUT dif_salary DOUBLE) BEGIN # 分析:查询出emp_id员工的工资;查询出emp_id员工管理者的id,查询管理者id工资;计算两个工资差值 #声明局部变量DECLARE emp_sal,mgr_sal DOUBLE DEFAULT 0.0; # 记录员工工资DECLARE mgr_id INT; # 记录管理者工资SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;SELECT manager_id INTO mgr_id FROM employees WHERE employee_id = emp_id;SELECT salary INTO mgr_sal FROM employees WHERE employee_id = mgr_id;SET dif_salary = mgr_sal - emp_sal; END // DELIMITER ; #调用 SET @emp_id = 102; CALL different_salary(@emp_id,@diff_sal); #查看 SELECT @diff_sal;
1.2.4 会话用户变量月局部变量对比
用户变量分类 | 作用域 | 定义位置 | 语法 |
---|---|---|---|
会话用户变量 | 当前会话 | 会话的任何地方 | 加@符号,不用指定类型 |
局部变量 | 定义它的BEGIN END中 | BEGIN END的第一句话 | 一半不用加@,需要指定类型 |
2. 配置文件的使用
2.1 配置文件格式
[mysqld]
:以键值对的形式
2.2 启动命令与选项组
2.3 特定的MYSQL版本的专用选项组
- 可以在选项组名称后加MYSQL的版本号
2.4 同一个配置文件中多个组的优先级
2.5 命令行和配置文件中启动选项的区别
- 命令行和配置文件中都有时,以
命令行
为准