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中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
May 26 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
解决Mysql的left join无效及使用的注意事项说明
Jul 01 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
SQL 聚合、分组和排序
Nov 11 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
Nov 17 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
MySQL中的全表扫描和索引树扫描
May 15 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
Sep 23 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
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
php二维数组转成字符串示例
2014/02/17 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
php编程每天必学之表单验证
2016/03/01 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
vue中axios处理http发送请求的示例(Post和get)
2017/10/13 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
python palywright库基本使用
2021/01/21 Python
瑜伽服装品牌:露露柠檬(lululemon athletica)
2017/06/04 全球购物
质检部岗位职责
2013/11/11 职场文书
服务承诺书格式
2014/05/21 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
应届生自荐信
2014/06/30 职场文书
车间质检员岗位职责
2015/04/08 职场文书
Python利用folium实现地图可视化
2021/05/23 Python