Mysql中使用自定义变量生成连续数字或日期

本文介绍了MySQL自定义变量的使用,包括赋值、运算和限制,并通过示例展示了如何使用自定义变量生成连续数字和日期,强调了在特定场景下优化器可能的影响及未定义变量的潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL自定义变量

此blog中MySQL版本为:5.7.21

 

mysql使用@来定义自定义变量。

1、把常量赋值给自定义变量

SELECT @num:=1 AS num;

2、把函数赋值给自定义变量

SELECT @DATE:=NOW();

3、把查询结果赋值给自定义变量。注意:查询结果只能返回一个结果,返回多个会报错:[Err] 1242 - Subquery returns more than 1 row

SELECT @id:= (SELECT id FROM table WHERE id =100);

4、自定义变量可以运算

SELECT @num:=@num+1 AS num FROM (SELECT @num:=0) t ;

5、可以使用表达式的地方使用自定义变量

SELECT ... WHERE col <= @num;

MySQL自定义变量的属性和限制

  • 使用自定义变量的查询,无法使用查询缓存
  • 不能再使用常量或者标识符的地方使用自定义变量,例如表名、列名和LIMIT子句中。
  • 用户自定义变量的生命周期是在一个连接中有效,所以不能用它们来做连接间的通信。
  • 如果使用连接池或者持久化连接,自定义变量可能让看起来毫无关系的代码发生交互。
  • 自定义变量的类型是一个动态类型。
  • MySQL优化器在某些场景下可能会将这些变量优化掉,这可能导致代码不按预想的方式运行。
  • 赋值的顺序和赋值的时间点并不总是固定的,这依赖于优化器的决定。
  • 赋值符号 :=的优先级非常低,所以需要注意,赋值表达式应该使用明确的括号。
  • 使用未定义变量不会产生任何语法错误,如果没有意识到这一点,非常容易犯错。

MySQL中使用自定义变量生成连续数字

eg:

SELECT @xi:=@xi+1 as xc from 
            (SELECT 1 UNION SELECT 2 ) xc1, 
            (SELECT 1 UNION SELECT 2 UNION SELECT 3 ) xc2,  
            (SELECT @xi:=0) xc0;

结果:

利用笛卡尔积生成数据行,然后使用自定义变量的运算功能生成连续数字。

本例子中两个(SELECT 1 UNION SELECT 2 )笛卡尔积生成6行数据 ,然后自定义变量就根据生成的行数进行运算,生成了1-6的连续数字。

MySQL中使用自定义变量生成了连续日期

利用上面生成的连续数字,就可以使用MySQL内置函数生成连续日期或者时间了。

eg:

select DATE_FORMAT(SUBDATE(NOW(), interval (numlist.xc*30) MINUTE),'%Y-%m-%d %H:%i:%s') as 'datetime' from 
 (SELECT @xi:=@xi+1 as xc from 
            (SELECT 1 UNION SELECT 2 UNION SELECT 3 ) xc1, 
            (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc2,  
            (SELECT @xi:=0) xc0) as numlist;

结果:

本例子中利用生成的连续数字,生成当前时间前的连续半小时。

 

以上是学习MySQL的一点心得体会,欢迎大神拍砖。

参考:

Mysql自定义变量的使用:https://www.cnblogs.com/guaidaodark/p/6037040.html

mysql生成连续数字或日期:https://blog.youkuaiyun.com/qiuli_liu/article/details/81707562

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值