mysql 自定义变量自增_Mysql自定义变量的使用

用户自定义变量是一个容易被遗忘的MySQL特性,但是如果能用的好,发挥其潜力,在某些场景可以写出非常高效的查询语句。在查询中混合使用过程化和关系化逻辑的时候,自定义变量可能会非常有用。单纯的关系查询将所有的东西都当成无序的数据集合,并且一次性操作它们。MySQL则采用了更加程序化的处理方式。MySQL的这种方式有它的弱点,但如果能够熟练地掌握,则会发现其强大之处,而用户自定义变量也可以给这种方式带...
摘要由CSDN通过智能技术生成

用户自定义变量是一个容易被遗忘的MySQL特性,但是如果能用的好,发挥其潜力,在某些场景可以写出非常高效的查询语句。在查询中混合使用过程化和关系化逻辑的时候,自定义变量可能会非常有用。单纯的关系查询将所有的东西都当成无序的数据集合,并且一次性操作它们。MySQL则采用了更加程序化的处理方式。MySQL的这种方式有它的弱点,但如果能够熟练地掌握,则会发现其强大之处,而用户自定义变量也可以给这种方式带来很大的帮助。

用户自定义变量是一个用来存储内容的临时容器,在连接MySQL的整个过程中都存在,可以使用下面的SET和SELECT语句来定义它们:

mysql> SET @one := 1;

mysql> SET @min_actor := (SELECT MIN(actor_id) FROM sakila.actor);

mysql> SET @last_week := CURRENT_DATE - INTERVAL 1 WEEK;

然后可以在任何可以使用表达式的地方使用这些自定义变量:

SELECT ... WHERE col <= @last_week;

在了解自定义变量的强大之前,我们先来看看它自身的一些属性和限制,看看在哪些场景下我们不能使用用户自定义变量:

使用自定义变量的查询,无法使用查询缓存

不能再使用常量或者标识符的地方使用自定义变量,例如表名、列名和LIMIT子句中。

用户自定义变量的生命周期是在一个连接中有效,所以不能用它们来做连接间的通信。

如果使用连接池或者持久化连接,自定义变量可能让看起来毫无关系的代码发生交互。

自定义变量的类型是一个动态类型。

MySQL优化器在某些场景下可能会将这些变量优化掉,这可能导致代码不按预想的方式运行。

赋值的顺序和赋值的时间点并不总是固定的,这依赖于优化器的决定。

赋值符号 :=的优先级非常低,所以需要注意,赋值表达式应该使用明确的括号。

使用未定义变量不会产生任何语法错误,如果没有意识到这一点,非常容易犯错。

优化排名语句

使用自定义变量的一个特性是你可以在给一个变量赋值的同时使用这个变量,即“左值”特性。例如:

mysql> SET @rownum := 0;

mysql> SELECT actor_id, @rownum := @rownum + 1 AS rownum

FROM actor order by actor_id LIMIT 3;

+----------+--------+

| actor_id | rownum |

+----------+--------+

| 1 | 1 |

| 2 | 2 |

| 3 | 3 |

+----------+--------+

这个例子的实际意义并不大,它只是实现了一个和该表主键一样的列。不过,我们可以把这当作一个排名。现在我们来看一个更复杂的用法。我们先编写一个查询获取演过最多电影的前10位演员,然后根据他们的出演电影次数做一个排名,如果出演的电影数量一样,则排名相同。我们先编写一个查询,返回每个演员参演电影的数量。

mysql> SET @curr_cnt := 0, @prev_cnt := 0, @rank := 0;

mysql> SELECT actor_id, COUNT(*) as cnt

-> FROM film_actor

-> GROUP BY actor_id

-> ORDER BY cnt DESC

-> LIMIT 10;

+-------

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值