(超实用、简单明了)Mysql变量定义与赋值

本文详细介绍了MySQL中的三种变量:局部变量、用户变量和系统变量。包括如何声明、赋值及使用这些变量,并提供了丰富的示例代码。

最近在使用存储过程定时创建分区的时候,运行时经常报错,原因都是因为变量的定义或者赋值问题导致的,在此记录一下MySQL的变量定义及赋值,方便自己和大家查阅,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

另外,这是一个系列文章,最终我们将实用MySQL定时器和存储过程,实现定时自动创建分区功能,这是在此之前需要掌握的知识点,感兴趣的敬请关注。

目录

局部变量

声明变量

变量赋值

用户变量

变量赋值

系统变量

查看变量

修改变量


局部变量

通常用在存储过程或函数中,定义在 begin and之间。

声明变量

DECLARE var_name[,...] type [DEFAULT value]
  • DECLARE:声明变量的关键字。

  • var_name:变量的名称,可同时定义多个。

  • type:变量数据类型。

  • DEFAULT value:为变量定义默认值,默认值为NULL。

示例:

定义一个变量 a ,数据类型为 int ,默认值为 0:

declare a int default value 0;

变量赋值

方式一使用 set 关键字赋值。

SET var_name = expr[,var_name = expr]...
  • set:变量赋值关键字。

  • var_name: 变量的名称;

  • expr: 赋值表达式。

注意:一个 SET 语句可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。

示例:

将变量 a 赋值为10:

set a=10;

方式二使用 SELECT ... INTO 赋值。

SELECT col_name [...] INTO var_name[,...]
FROM table_name WEHRE condition
  • col_name: 查询的字段名称。

  • var_name: 变量的名称。

  • table_name: 参数指表的名称。

  • condition: 指查询条件。

注意:将查询结果赋值给变量时,该查询语句的返回结果只能是单行。

示例:

从 t_user 表中查询id为2的记录,将该记录的 user_name 赋值给变量 uname:

select user_name into uname from t_user where id = 2;

用户变量

详情见官网 User-Defined Variables

用户变量无需声明,直接赋值即可。用户变量名不区分大小写。名称的最大长度为64个字符。

变量赋值

方式一使用 SET 赋值。

可以使用形如 set @变量名=变量值 或者 set@变量名:=变量值 的方式赋值。

SET @var_name = expr [, @var_name = expr] ...
或
SET @var_name := expr [, @var_name := expr] ...

示例:

SET @a=1,@b=2;
SELECT @a,@b;

查询结果如下:

 方式二使用 SELECT 赋值。

select @变量名:=变量值
select @变量名:=字段名 from table where ... limit 1;

示例:

SELECT @a:=1,@b:=2 AS b;
SELECT @a,@b;

示例:

现有表 t_user :

SELECT @a:=user_name FROM t_user WHERE id =1;

查询结果如下:

 再看如下语句:

SELECT @a:=user_name FROM t_user WHERE age =18;

 查询结果如下:

注意: 通过查询表给变量赋值时,需保证查询结果只有一条记录,如上这种查询除了三条,最好在查询后进行 limit 操作。

更多示例:

SET @t1=1, @t2=2, @t3:=4;
SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;

SET @a=1;
SET @a = @a + 1;
SELECT @a;

 

SET @a=1;
SELECT @a, @a:=@a+1

系统变量

像我们使用MySQL定时器一样,首先我们使用 SHOW VARIABLES LIKE '%event_sche%'; 查看是否开启了定时器支持,这里我们查的就是 系统变量,准确来说是系统变量中的 全局变量(GLOBAL)。

GLOBAL全局变量在MySQL启动时由服务器自动初始化默认值,这些默认值可通过MySQL的配置文件my.cnf进行更改。临时性修改可以直接使用 set 进行设置,但是重启服务后会设置失效。

SESSION类型会话变量在每一次建立新链接是初始化,作用域与用户变量一样,仅限于当前连接。

查看变量

方式一:使用 SHOW VARIABLES 语句或变量名。

以查看是否自动提交为例:

SHOW VARIABLES LIKE '%autocommit';

 显示所有会话变量:

show [session] variables;

其实session不管带不带,默认查询的都是会话变量。

显示所有全局变量:

show global variables;

方式二:使用 SELECT @@

以查看是否自动提交为例:

SELECT @@autocommit;

修改变量

修改全局变量:

以修改是否自动提交为例:

SET GLOBAL autocommit=1;
SET @@global.autocommit=1;

修改会话变量:

SET autocommit=1;
SET SESSION autocommit=1;
SET @@global.autocommit=1;
<think>好的,我现在需要帮助用户在MySQL中创建用户变量并查询它们的值。用户之前的问题是关于Python变量赋值和计算,现在转向MySQL,所以我得确保回答符合MySQL的语法和特性。 首先,用户提到了三个变量:goods、price和total。其中goods是字符串'充电宝',price是188.8,total是price乘以3。在MySQL中,用户变量使用@符号声明,这点和Python不同,需要特别注意。 接下来,赋值部分。MySQL中使用SET语句来给变量赋值。对于goods这样的字符串,需要用单引号括起来,并且整个SET语句要正确结束。例如,SET @goods = '充电宝';。同样,price的赋值是数值类型,可以直接SET @price = 188.8;。而total需要计算price乘以3,这里可以直接在SET语句中进行计算,比如SET @total = @price * 3;。需要确保变量作用域正确,用户变量在会话期间有效,所以这些变量在同一个连接中可用。 然后是查询变量值。在MySQL中,可以使用SELECT语句来显示变量的值。比如SELECT @goods, @price, @total;,这会返回一个结果集显示三个变量的值。另外,用户可能需要格式化输出,这时候可以用SELECT语句配合别名来让结果更易读,例如SELECT @goods AS goods_name, @price AS unit_price, @total AS total_price;。 另外,用户之前的问题中提到了触发器和会话变量,引用1里提到会话变量和用户变量的作用域。需要确保用户理解MySQL用户变量的作用域仅限于当前连接,这和Python中的变量不同,后者在脚本执行期间有效,而MySQL变量在断开连接后会被释放。 可能需要注意的问题包括:用户变量的命名是否合法,避免使用保留字;字符串和数值类型的正确赋值;以及计算时的变量引用是否正确。例如,在计算total时,必须使用@price来引用之前定义变量,否则会出现错误。 此外,用户可能需要了解如何在存储过程或触发器中使用变量,但根据当前问题,可能不需要深入这部分,但可以简要提及用户变量的常见用途,比如在复杂查询中暂存中间结果。 最后,需要验证示例代码的正确性,确保在MySQL环境中能够顺利执行,不会出现语法错误。例如,变量赋值必须使用SET,而查询使用SELECT,并且每个语句以分号结尾。 总结步骤:使用SET声明并赋值变量,然后用SELECT查询变量值,同时注意变量作用域和语法细节。确保示例代码简洁明了,用户能够直接复制执行。</think>### 分步解答 #### 在MySQL中创建用户变量并查询值的步骤如下: 1. **变量声明赋值** - MySQL使用`@`符号定义用户变量,通过`SET`或`SELECT`语句赋值 ```sql -- 赋值字符串和数值 SET @goods = '充电宝'; SET @price = 188.8; -- 计算total(直接引用已定义变量) SET @total = @price * 3; ``` 2. **查询变量值** - 使用`SELECT`语句查看变量内容 ```sql -- 基础查询 SELECT @goods, @price, @total; -- 带列名的格式化输出 SELECT @goods AS goods_name, @price AS unit_price, @total AS total_price; ``` 3. **执行结果示例** ```text +------------+-------------+--------------+ | goods_name | unit_price | total_price | +------------+-------------+--------------+ | 充电宝 | 188.8 | 566.4 | +------------+-------------+--------------+ ``` ### 关键说明 1. **变量作用域** - 用户变量(`@var`)仅在当前数据库连接中有效,关闭连接后自动释放[^1] - 全局变量、会话变量的区别:用户变量无需特殊权限,直接通过`@`定义 2. **赋值注意事项** - 字符串需用单引号包裹 - 变量间可直接进行数学运算(如`@price * 3`) - 赋值运算符`=`优先级低于数学运算符 3. **编程语言的区别** | 特性 | Python | MySQL | |--------------|---------------------|---------------------| | 变量声明 | 动态类型 | 必须带`@`前缀 | | 作用域 | 函数/模块级 | 当前连接会话 | | 输出方式 | `print()`函数 | `SELECT`语句 | ### 扩展应用 - **在存储过程中使用变量** ```sql DELIMITER $$ CREATE PROCEDURE calculate_total() BEGIN SET @price = 188.8; SET @total = @price * 3; SELECT @total; END$$ DELIMITER ; -- 调用存储过程 CALL calculate_total(); ``` ### 常见错误处理 | 错误场景 | 解决方法 | |-----------------------|-----------------------------| | 变量定义直接使用 | 确保变量已通过`SET`初始化 | | 字符串未加引号 | 检查单引号包裹(如`'充电宝'`)| | 运算结果精度丢失 | 使用`DECIMAL`类型代替浮点数 |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值