MySQL变量

1.局部变量

MySQL局部变量常用在存储过程的语句块(BEGIN / END)中,其作用域仅限于当前语句块内,当语句块执行完毕后,局部变量就消失了。

(1)定义变量:

DECLARE varName varType [DEFAULT defVal];

使用 DECLARE 关键字定义局部变量,变量名和变量类型是必须要指定的,默认值可选。

(2)示例

DELIMITER $$

DROP PROCEDURE IF EXISTS `tmpVar_test`$$

CREATE PROCEDURE `test`.`tmpVar_test`(OUT aa VARCHAR(5),OUT bb INT)
   
    BEGIN
        DECLARE a VARCHAR(5);
        DECLARE b INT DEFAULT 22;
        SET aa = a;
        SET bb = b;
    END$$

DELIMITER ;

如果没有给变量指定默认值,则它的系统默认值为 NULL。

也可以使用 SET 关键字给变量赋值。

2.用户变量

用户变量的作用域要比局部变量要广。用户变量可以作用于当前整个连接,但是当当前连接断开后,其所定义的用户变量都会消失。

(1)定义变量

用户变量的命名语法是 “@变量名”

(2)变量赋值

方式一:

SELECT @userName := name FROM user WHERE id = 1;

这条语句所做的事情是:查出 user 表中 id 等于 1 的用户名,然后赋值给变量 userName;

使用这种方式来赋值的话,只能使用冒号加等号( := ),而不能直接使用等号。因为在SELECT语句中,等号会被看做是比较操作符。

方式二:

SET @userName = (SELECT name FROM user WHERE id = 2);

SET @currTime := CURRENT_TIMESTAMP();

使用 SET 关键字给变量赋值时,可以直接使用等号,也可以使用冒号加等号。

(3)使用变量

SELECT @salToLisi := salary FROM employee WHERE NAME = '李四';

-- 使用方式一
SELECT @salToLisi;

-- 使用方式二
SELECT * FROM employee WHERE salary < @salToLisi;

3.会话变量

未完待续...

4.全局变量

未完待续...

 

【参考博客】https://www.cnblogs.com/gavin110-lgy/p/5772577.html

### MySQL变量的定义及作用域 #### 用户定义变量 用户定义变量是一种在会话期间有效的变量,可以通过 `@` 符号进行声明和赋值。这些变量不需要显式的声明即可使用,并且它们的作用范围限于当前用户的会话。 以下是用户定义变量的基本用法: ```sql -- 赋值方法1:使用 SET 命令 SET @my_var = 'Hello, World!'; -- 赋值方法2:在 SELECT 查询中直接赋值 SELECT 'Hello, World!' INTO @my_var; -- 使用变量 SELECT @my_var; ``` 需要注意的是,用户定义变量在整个会话期间都保持其值,直到会话结束或被重新赋值[^1]。 --- #### 局部变量 局部变量主要用于存储过程或函数内部,通常通过 `DECLARE` 关键字进行定义。这类变量的作用域严格限定在其所在的代码块内。 以下是一个简单的例子展示如何定义并使用局部变量: ```sql DELIMITER $$ CREATE PROCEDURE example_procedure() BEGIN DECLARE local_var INT DEFAULT 0; -- 定义局部变量 -- 对局部变量赋值 SET local_var = 10; -- 输出局部变量的值 SELECT local_var; END$$ DELIMITER ; ``` 局部变量只能在其所属的过程或函数范围内访问,超出该范围则无法识别[^2]。 --- #### 系统变量 系统变量是由 MySQL 系统预定义的一组配置项,用于控制服务器的行为。系统变量分为两种类型: - **全局变量**:影响整个 MySQL 实例的行为。 - **会话变量**:仅适用于特定的客户端连接。 ##### 查看系统变量的方法 ```sql -- 查看所有全局变量 SHOW GLOBAL VARIABLES; -- 查看部分全局变量 SHOW GLOBAL VARIABLES LIKE '%char%'; -- 获取单个全局变量的值 SELECT @@global.autocommit; -- 设置全局变量的值 SET GLOBAL autocommit = 0; -- 查看会话变量 SHOW SESSION VARIABLES; -- 获取单个会话变量的值 SELECT @@session.sql_mode; -- 修改会话变量的值 SET SESSION sql_mode = 'STRICT_ALL_TABLES'; ``` 值得注意的是,修改全局变量会影响新建立的会话,默认情况下不会改变现有会话中的对应会话变量[^3]。 --- #### 变量作用域的区别 | 类型 | 定义方式 | 作用域 | |--------------|------------------------------|---------------------------------| | 用户定义变量 | 使用 `@` 符号 | 当前会话 | | 局部变量 | 使用 `DECLARE` | 存储过程/函数内的代码块 | | 系统变量 | 预定义 | 全局(所有会话)或会话(单一连接) | --- ### 示例代码 下面提供了一个综合示例,展示了不同类型变量的应用场景: ```sql -- 用户定义变量 SET @user_var = 42; SELECT @user_var; -- 创建带局部变量的存储过程 DELIMITER $$ CREATE PROCEDURE calculate_square(IN input_value INT, OUT result INT) BEGIN DECLARE temp INT; -- 局部变量 SET temp = input_value * input_value; SET result = temp; END$$ DELIMITER ; CALL calculate_square(5, @output); SELECT @output; -- 修改系统变量 SET GLOBAL max_connections = 200; SELECT @@GLOBAL.max_connections; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值