解析MySQL中DELETE语句中别名的使用

 更新时间:2023年11月23日 09:06:54   作者:爱可生开源社区  
这篇文章主要为大家介绍了MySQL中DELETE语句中别名的使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

某天,正按照业务的要求删除不需要的数据,在执行 DELETE 语句时,竟然出现了报错(MySQL 数据库版本 5.7.34):

mysql> delete from test1 t1 where not exists (select 1 from test2 t2 where t1.id=t2.id);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't1 where not exists (select 1 from test2 t2 where t1.id=t2.id)' at line 1

这就有点奇怪了,因为我在执行删除语句之前,执行过同样条件的 SELECT 语句,只是把其中的 select * 换成了 delete 而已,毕竟这个语法的报错一般来说原因很大可能是 关键字拼写错误 或者 存在中文符号

排除了上面的原因后,再从语句本身的逻辑来排查,难道说 DELETE 语句不支持 not exists 这种写法?好像之前也没听说过这个限制。我们还是以语法错误这个原因为起点,去查查官方文档看下能不能找出答案。

分析

DELETE 的语法如下

5.7 单表删除格式

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

仔细对比了以下,发现了一些端倪,这里的语法并没有写出表名的别名用法,难道是使用了别名的原因?

mysql> delete from test1 where not exists (select 1 from test2 where test1.id=test2.id);
Query OK, 1 row affected (0.00 sec)

经测试去掉了别名还真的执行成功了,但我印象中之前删除数据的时候用过别名,于是我再继续深挖文档查查看。

对比不同地方和不同版本的格式差异后,我终于明白了问题的起因。在不同版本,甚至不同情况下都有差异。

8.0 单表删除格式

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
    [PARTITION (partition_name [, partition_name] ...)]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

5.7 和 8.0 多表删除格式

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]

经过上面语法对比的不同发现,5.7 的单表删除确实不支持别名的使用,但是多表删除却支持(table_references 里包含别名的使用)。

并且在 8.0.16 开始,单表删除已经支持使用别名了。

For consistency with the SQL standard and other RDBMS, table aliases are now supported in single-table as well as multi-table DELETE statements. (Bug #27455809)

结论

  • MySQL 5.7 使用单表删除语句时,不能使用别名,多表删除可以使用别名。
  • MySQL 8.0.16 开始单表多表都可以使用别名。

以上就是解析MySQL中DELETE语句中别名的使用的详细内容,更多关于MySQL DELETE语句别名的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL回表产生的原因和场景

    MySQL回表产生的原因和场景

    在MySQL数据库中,回表(Look Up)指的是在进行索引查询时,首先通过索引定位到对应页,然后再根据行的物理地址找到所需的数据行,本文给大家介绍了MySQL回表是什么以及哪些情况下会回表,需要的朋友可以参考下
    2023-11-11
  • mysql存储过程基础之遍历多表记录后插入第三方表中详解

    mysql存储过程基础之遍历多表记录后插入第三方表中详解

    这篇文章主要给大家介绍了关于mysql存储过程教程之遍历多表记录后插入第三方表中的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-07-07
  • mysql中的临时表如何使用

    mysql中的临时表如何使用

    这篇文章主要介绍了mysql中的临时表如何使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • MySQL数据库约束详解

    MySQL数据库约束详解

    mysql常见约束有:1、非空约束“not null”;2、唯一性约束“unique”;3、主键约束“primary key”;4、外键约束“foreign key”;5、默认值约束“Default”等等。
    2022-10-10
  • MySql Installer 8.0.18可视化安装教程图文详解

    MySql Installer 8.0.18可视化安装教程图文详解

    这篇文章主要介绍了MySql Installer 8.0.18可视化安装教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • InnoDB引擎中的事务详解

    InnoDB引擎中的事务详解

    这篇文章主要介绍了InnoDB引擎中的事务详解,事务Transaction是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行,需要的朋友可以参考下
    2023-09-09
  • MySQL 聚合查询 和 分组查询示例详解

    MySQL 聚合查询 和 分组查询示例详解

    聚合查询是SQL中对数据进行分组统计的操作,可以将多行数据按照特定条件合并计算,返回汇总结果,本文通过实例代码讲解MySQL聚合查询和 分组查询,感兴趣的朋友一起看看吧
    2025-04-04
  • mysql中替代null的IFNULL()与COALESCE()函数详解

    mysql中替代null的IFNULL()与COALESCE()函数详解

    这篇文章主要给大家介绍了关于mysql中替代null的IFNULL()与COALESCE()函数的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看看吧。
    2017-06-06
  • MySQL日志机制深度解析

    MySQL日志机制深度解析

    MySQL的日志机制是保障数据可靠性、支持故障恢复、排查性能问题的核心组件,本文给大家介绍MySQL日志机制解析,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • MySQL分库分表详情

    MySQL分库分表详情

    互联网项目中常用到的关系型数据库是MySQL,随着用户和业务的增长,传统的单库单表模式难以满足大量的业务数据存储以及查询,单库单表中大量的数据会使写入、查询效率非常之慢,此时应该采取分库分表策略来解决。本篇文章主要介绍MySQL分库分表,需要的朋友可以参考一下
    2021-09-09

最新评论