加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

如何对 mysql变量进行定制

发布时间:2023-06-17 14:59:54 所属栏目:MySql教程 来源:
导读:这篇文章主要介绍“mysql变量怎么自定义”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql变量怎么自定义”文章能帮助大家解决问题。

系统变
这篇文章主要介绍“mysql变量怎么自定义”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql变量怎么自定义”文章能帮助大家解决问题。
 
系统变量
 
简介
 
1、系统变量
 
    系统变量分为全局系统变量(需要添加 global 关键字)以及会话系统变量(需要添加 session 关键字),有时也把全局系统变量简称为全局变量,有时也把会话系统变量称为local变量。如果不写,默认会话级别
 
    全局系统变量针对于所有会话(连接)有效,但 不能跨重启
 
    在MySQL中有些系统变量只能是全局的,例如 max_connections 用于限制服务器的最大连接数;有些系统变量作用域既可以是全局又可以是会话,例如 character_set_client 用于设置客户端的字符集;有些系统变量的作用域只能是当前会话,例如 pseudo_thread_id 用于标记当前会话的 MySQL 连接 ID
 
2、用户自定义变量
 
    每一个MySQL客户机成功连接MySQL服务器后,都会产生与之对应的会话。会话期间,MySQL服务实例会在MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系统变量值的复制
 
    会话系统变量仅针对于当前会话(连接)有效。会话期间,当前会话对某个会话系统变量值的修改,不会影响其他会话同一个会话系统变量的值
 
    会话1对某个全局系统变量值的修改会导致会话2中同一个全局系统变量值的修改
 
代码案例
 
# 查看系统变量
 
# 查询全局系统变量
 
SHOW GLOBAL VARIABLES;
 
# 查询会话系统变量
 
SHOW SESSION VARIABLES;
 
# 默认查询的是会话系统变量
 
SHOW VARIABLES;
 
# 查询部分系统变量
 
# 模糊查询
 
SHOW GLOBAL VARIABLES LIKE 'admin_%';
 
SHOW VARIABLES LIKE 'character_%';
 
# 查看指定系统变量
 
SELECT @@global.max_connections;
 
SELECT @@global.character_set_client;
 
# 错误写法,由于该变量是会话系统变量
 
SELECT @@global.pseudo_thread_id;
 
# 错误写法,由于该变量是全局系统变量
 
SELECT @@session.max_connections;
 
# 查看会话系统变量
 
SELECT @@session.character_set_client;
 
SELECT @@session.pseudo_thread_id;
 
# 当变量在全局系统变量或会话系统量中都有时,先查询会话系统变量,再查询全局系统变量
 
SELECT @@character_set_client;
 
# 修改系统变量的值
 
# 修改全局系统变量
 
# 方式1:
 
SET @@global.max_connections = 161;
 
# 方式2:
 
SET GLOBAL max_connections = 171;
 
# 针对于当前的数据库实例是有效的,一旦重启mysql服务,就失效了
 
# 修改会话系统变量
 
# 方式1:
 
SET @@session.character_set_client = 'gbk';
 
# 方式2:
 
SET SESSION character_set_client = 'gbk';
 
# 针对于当前会话是有效的,一旦结束会话,重新建立起新的会话,就失效了
 
用户变量
 
简介
 
分为会话用户变量和局部变量
 
会话用户变量:作用域和会话变量一样,只对 当前连接 会话有效
 
局部变量:只在 BEGIN 和 END 语句块中有效。局部变量只能在 存储过程和函数 中使用
 
定义变量
 
#方式1:“=”或“:=”
 
SET @用户变量 = 值;
 
SET @用户变量 := 值;
 
#方式2:“:=” 或 INTO关键字
 
SELECT @用户变量 := 表达式 [FROM 等子句];
 
SELECT 表达式 INTO @用户变量 [FROM 等子句];
 
查看用户变量的值
 
SELECT @用户变量
 
会话用户变量代码案例
 
# 方式1:
 
SET @m1 = 1;
 
SET @m2 := 2;
 
SET @sum := @m1 + @m2;
 
# 查看
 
SELECT @sum;
 
# 方式2:
 
SELECT @count := COUNT(*) FROM employees;
 
SELECT @count;
 
SELECT AVG(salary) INTO @avg_sal FROM employees;
 
SELECT @avg_sal;
 
局部变量简介
 
使用DECLARE声明
 
声明并使用在BEGIN ... END 中 (使用在存储过程、函数中)
 
DECLARE的方式声明的局部变量必须声明在BEGIN中的首行的位置
 
BEGIN
 
    #声明局部变量
 
    DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值];
 
    DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值];
 
    #为局部变量赋值
 
    SET 变量名1 = 值;
 
    SELECT 值 INTO 变量名2 [FROM 子句];
 
    #查看局部变量的值
 
    SELECT 变量1,变量2,变量3;
 
END
 
# 定义变量
 
DECLARE 变量名 类型 [default 值]; # 如果没有DEFAULT子句,初始值为NULL
 
# 赋值
 
# 方式1
 
SET 变量名=值;
 
SET 变量名:=值;
 
# 方式2
 
SELECT 字段名或表达式 INTO 变量名 FROM 表;
 
# 查看
 
SELECT 局部变量名;
 
局部变量代码案例
 
DELIMITER //    # 开始
 
CREATE PROCEDURE test_var()   # 创建存储过程
 
BEGIN
 
  #1、声明局部变量
 
  DECLARE a INT DEFAULT 0;
 
  DECLARE b INT ;
 
  # DECLARE a,b INT DEFAULT 0;    # 写法2
 
  DECLARE emp_name VARCHAR(25);
 
  #2、赋值
 
  SET a = 1;
 
  SET b := 2;
 
  # 将last_name赋值给emp_name
 
  SELECT last_name INTO emp_name FROM employees WHERE employee_id = 101;
 
  #3、使用
 
  SELECT a,b,emp_name;  
 
END //
 
DELIMITER;    # 结束
 
#调用存储过程
 
CALL test_var();
 
# 举例1:声明局部变量,并分别赋值为employees表中employee_id为102的last_name和salary
 
DELIMITER //      # 开始
 
CREATE PROCEDURE test_pro()
 
BEGIN
 
  #声明
 
  DECLARE emp_name VARCHAR(25);
 
  DECLARE sal DOUBLE(10,2) DEFAULT 0.0;
 
  #赋值
 
  SELECT last_name,salary INTO emp_name,sal   # 赋值
 
  FROM employees
 
  WHERE employee_id = 102;
 
  #使用
 
  SELECT emp_name,sal;
 
END //
 
DELIMITER ;   # 结束
 
# 调用存储过程
 
CALL test_pro();
 
# 举例2:声明两个变量,求和并打印 (分别使用会话用户变量、局部变量的方式实现)
 
# 方式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 := 100;
 
  SET sum_val = value1 + value2;
 
  #使用
 
  SELECT sum_val;
 
END //
 
DELIMITER ;
 
#调用存储过程
 
CALL add_value();
 
# 举例3:创建存储过程“different_salary”查询某员工和他领导的薪资差距,并用IN参数emp_id接收员工id,用OUT参数dif_salary输出薪资差距结果
 
DELIMITER //    # 开始
 
CREATE PROCEDURE different_salary(IN emp_id INT, OUT dif_salary DOUBLE)   # 输出dif_salary DOUBLE
 
BEGIN
 
  #分析:查询出emp_id员工的工资;查询出emp_id员工的管理者的id;查询管理者id的工资;计算两个工资的差值
 
  #声明变量
 
  DECLARE emp_sal DOUBLE DEFAULT 0.0; #记录员工的工资
 
  DECLARE mgr_sal DOUBLE DEFAULT 0.0; #记录管理者的工资
 
  DECLARE mgr_id INT DEFAULT 0; #记录管理者的id
 
  #赋值
 
  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 := 103;
 
SET @dif_sal := 0;
 
CALL different_salary(@emp_id,@dif_sal);
 
# 查看
 
SELECT @dif_sal;
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!