MySQL 自定义变量的概念及特点


Posted in MySQL onMay 13, 2021

MySQL 的自定义 就是存储值的临时容器,只要与服务端的连接是活跃的,容器中的值可以保存和使用。可以通过简单的 SET 或 SELECT语句 设置自定义变量,如下所示:

SET @one := 1;
SET @min_actor := (SELECT MIN(actor_id) FROM sakila.actor);
SET @last_week := CURRENT_DATE-INTERNAL 1 WEEK;

定义好变量后,就可以在 SQL 语句中使用这个变量:

SELECT * FROM film WHERE created_date <= @last_week;

虽然 MySQL 自定义变量很强大,但是也需要知道自定义变量本身也是有缺陷的,这些缺陷包括:

  • 自定义变量会禁用查询缓存。
  • 不可以用做替代语义上的标识符,例如表名称或列名称,或者是在 LIMIT 子句中使用。
  • 自定义变量是基于单次连接的,因此不可以跨连接使用。
  • 如果使用连接池或持久连接,自定义变量会导致你的代码与交互隔离,这出现的时候可能是代码的 bug 或连接池的 bug,但是是可能发生的。
  • 在 MySQL 5.0以前的版本中是大小写敏感的,因此要注意(在 MySQL 5.0以后已经不区分大小写了)。
  • 无法显示地指定变量类型,而实际变量的类型依赖于不确定的类型推断,并且不同的版本会有差异,最好的方式是在一开始定义的时候指定类型,比如使用0设定整数变量,0.0设定浮点数变量,''用于字符串。但是如果后面指定了新的值,类型会跟随新的值改变,这是因为 MySQL 的自定义变量的类型是动态的。
  • 优化器在某些情况下有可能会将自定义变量优化掉,导致无法按照期望的方式进行查询。
  • 赋值的次序,甚至包括赋值的时间都是不确定的,这取决于优化器选择的查询计划。因此,最终的结果可能让人困惑。
  • 赋值操作符的优先级低于任何其他操作符,因此必须显示地使用括号。
  • 未定义变量不会报错,这很容导致错误出现。

自定义变量可以用在所有类型的语句中,而不仅仅是 SELECT 语句。事实上,这是自定义变量的一个最大的优势。例如,我们可以重写复杂的查询,例如利用子查询进行排序的计算,或者是完成一次低代价的UPDATE 语句。

有些时候,优化器会认为这个变量是编译时常量而不进行赋值,这会导致期望的行为很怪异。而将自定义变量的赋值放入类似 LEAST函数中通常会避免这个问题。另一个方式是在使用之前检查一下自定义变量是否有值。有时候你想这样做,但有些时候你不想这么做。

通过一些小的实验,我们可以使用自定义变量做很多有趣的事情,例如:

  • 计算总量和平均值;
  • 对于分组查询模拟 FIRST 和 LAST 函数;
  • 对于很大的数做数学运算;
  • 将一整张表转换成 MD5哈希值;
  • 过滤掉0值附近但超过设定边界的样本值;
  • 模拟读写指针位置;
  • 将变量嵌入到 WHERE 条件并在 SHOW 语句中显示。

自定义变量在某些应用场合很有用,例如统计出现次数的排序值,计算更新和插入相同数据的次数,以及延迟的联合查询,下一篇文章将介绍具体的用法。

以上就是MySQL 的自定义变量的概念及特点的详细内容,更多关于MySQL 自定义变量的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
浅谈Mysql多表连接查询的执行细节
Apr 24 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
MySQL 8.0 驱动与阿里druid版本兼容问题解决
Jul 01 MySQL
MySQL系列之二 多实例配置
Jul 02 MySQL
如何避免mysql启动时错误及sock文件作用分析
Jan 22 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
MySQL脏读,幻读和不可重复读
May 11 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySQL自定义函数及触发器
Aug 05 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
为什么mysql字段要使用NOT NULL
MySQL表字段时间设置默认值
May 13 #MySQL
MySql新手入门的基本操作汇总
May 13 #MySQL
MySQL中你可能忽略的COLLATION实例详解
浅谈mysql执行过程以及顺序
mysql 8.0.24版本安装配置方法图文教程
mysql 8.0.24 安装配置方法图文教程
You might like
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
第五节 克隆 [5]
2006/10/09 PHP
php xml文件操作代码(一)
2009/03/20 PHP
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
使用JavaScript实现连续滚动字幕效果的方法
2015/07/07 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
Python类的用法实例浅析
2015/05/27 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
基于python实现地址和经纬度转换
2020/05/19 Python
Python使用re模块验证危险字符
2020/05/21 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
个人综合鉴定材料
2014/05/23 职场文书
中考标语大全
2014/06/05 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
赤壁观后感(2)
2015/06/15 职场文书
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis