系统变量
| 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; |
| |
| |
| |
| |
| SET @@global.max_connections = 161; |
| |
| SET GLOBAL max_connections = 171; |
| |
| |
| |
| |
| |
| SET @@session.character_set_client = 'gbk'; |
| |
| SET SESSION character_set_client = 'gbk'; |
| |
| |
用户变量
| 分为会话用户变量和局部变量 |
| 会话用户变量:作用域和会话变量一样,只对 当前连接 会话有效 |
| 局部变量:只在 BEGIN 和 END 语句块中有效。局部变量只能在 存储过程和函数 中使用 |
会话用户变量
| #方式1:“=”或“:=” |
| SET @用户变量 = 值; |
| SET @用户变量 := 值; |
| |
| #方式2:“:=” 或 INTO关键字 |
| SELECT @用户变量 := 表达式 [FROM 等子句]; |
| SELECT 表达式 INTO @用户变量 [FROM 等子句]; |
| # 方式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; |
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术