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 08 MySQL
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
一篇文章弄懂MySQL查询语句的执行过程
May 07 MySQL
MySQL 重写查询语句的三种策略
May 10 MySQL
MySQL Router实现MySQL的读写分离的方法
May 27 MySQL
解决Mysql的left join无效及使用的注意事项说明
Jul 01 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 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
建立动态的WML站点(一)
2006/10/09 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
禁止F5等快捷键的JS代码
2007/03/06 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
2017/06/01 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
Python 定义只读属性的实现方式
2020/03/05 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
英国现代绅士品牌:Hackett
2017/12/17 全球购物
巴黎一票通:The Paris Pass
2018/02/10 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
理工科学生的自我评价
2013/12/15 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
高中物理教学反思
2016/02/19 职场文书
Golang的继承模拟实例
2021/06/30 Golang