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

 更新时间:2021年05月13日 10:22:54   作者:岛上码农  
MySQL 是可以自定义临时变量的,而临时变量在做查询优化和静态查询分析时十分有用。而实际上很少有人记得 MySQL 的自定义变量。本篇文章讲述 MySQL 的自定义变量的概念及特点。

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 字符集不同导致 left join 慢查询的问题解决

    MySql 字符集不同导致 left join 慢查询的问题解决

    当两个表的字符集不一样,在使用字符型字段进行表连接查询时,就需要特别注意下查询耗时是否符合预期,本文主要介绍了MySql 字符集不同导致 left join 慢查询的问题解决,感兴趣的可以了解一下
    2024-05-05
  • Windows server 2008 r2上安装MySQL5.7.10步骤

    Windows server 2008 r2上安装MySQL5.7.10步骤

    这篇文章主要介绍了Windows server 2008 r2上安装MySQL5.7.10的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 忘记mysql数据库root用户密码重置方法[图文]

    忘记mysql数据库root用户密码重置方法[图文]

    忘记mysql数据库root用户密码重置方法,需要的朋友可以参考下。
    2011-11-11
  • 安装配置mysql及Navicat prenium的详细流程

    安装配置mysql及Navicat prenium的详细流程

    这篇文章主要介绍了安装配置mysql及Navicat Premium的详细流程,配置方法也真的很简单,本文给大家详细介绍mysql Navicat Premium安装配置相关知识感兴趣的朋友,一起学习吧
    2021-06-06
  • MYSQL where 1=1判定中的作用说明

    MYSQL where 1=1判定中的作用说明

    最近看到很多sql里用到where 1=1,原来觉得这没用嘛,但是又想到如果没用为什么要写呢?
    2011-09-09
  • MySQL数据库命令

    MySQL数据库命令

    这篇文章主要介绍了数据库的常用命令,数据库中对表的命令以及一些常用的数据库查询和常用函数,感兴趣的小伙伴可以借鉴一下
    2023-03-03
  • CentOS7卸载MySQL5.7的方法步骤

    CentOS7卸载MySQL5.7的方法步骤

    这篇文章主要介绍了CentOS7卸载MySQL5.7的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • InnoDB 类型MySql恢复表结构与数据

    InnoDB 类型MySql恢复表结构与数据

    MySQL中.frm文件:保存了每个表的元数据,包括表结构的定义等,该文件与数据库引擎无关。MySQL中.ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per_table = 1)产生的存放该表的数据和索引的文件。
    2018-01-01
  • MySQL8.x登陆root用户突然提示mysql_native_password的实现

    MySQL8.x登陆root用户突然提示mysql_native_password的实现

    本文主要介绍了MySQL 8.x登陆root用户突然提示mysql_native_password,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • mysql对于模糊查询like的一些汇总

    mysql对于模糊查询like的一些汇总

    这篇文章主要给大家介绍了关于mysql对于模糊查询like的一些汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论