解析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语句别名的资料请关注脚本之家其它相关文章!

相关文章

  • 3种高效的Tags标签系统数据库设计方案分享

    3种高效的Tags标签系统数据库设计方案分享

    这篇文章主要介绍了3种高效的Tags标签系统数据库设计方案分享,现在主流的博客、CMS系统都有一个标签系统,本文就探讨它的数据库设计方式,需要的朋友可以参考下
    2014-07-07
  • 解读mysql删除操作和查询操作哪个更消耗性能

    解读mysql删除操作和查询操作哪个更消耗性能

    文章讨论了MySQL中删除操作比查询操作更消耗性能的原因,包括表级锁定、磁盘空间浪费、索引稀疏化和事务日志膨胀,同时,文章还提出了一些减少删除操作对性能影响的策略,如确保表上有合适的索引、分批次删除和使用合适的WHERE条件
    2025-02-02
  • MySQL基础学习之约束详解

    MySQL基础学习之约束详解

    约束是作用于表中字段上的规则,用于限制储存在表中的数据,这篇文章主要为大家介绍了MySQL中约束的案例以及外键约束的展示与删除,需要的可以参考一下
    2023-07-07
  • MySQL高效模糊搜索之内置函数locate instr position find_in_set使用详解

    MySQL高效模糊搜索之内置函数locate instr position find_in_set使用详解

    在MySQL中一般进行模糊搜索都是使用LIKE配合通配符进行查询的,在性能上一定的影响,下面给大家分享MYSQL自带的内置模糊搜索函数,除最后一个外其它三个性能上要比Like快些
    2018-09-09
  • MYSQL的索引使用注意小结

    MYSQL的索引使用注意小结

    这篇文章主要介绍了MYSQL的索引使用注意,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Mysql之索引长度限制方式

    Mysql之索引长度限制方式

    这篇文章主要介绍了Mysql之索引长度限制方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • MySQL基础之多表查询案例分享

    MySQL基础之多表查询案例分享

    这篇文章主要为大家分享了几个MySQL基础中的多表查询案例,文中的示例代码简洁易懂,对我们学习MySQL有一定的帮助,需要的小伙伴可以了解一下
    2022-10-10
  • MySQL中的binlog相关命令和恢复技巧

    MySQL中的binlog相关命令和恢复技巧

    这篇文章主要介绍了MySQL中的binlog相关命令和恢复技巧,需要的朋友可以参考下
    2014-05-05
  • MySQL 分组查询的优化方法

    MySQL 分组查询的优化方法

    这篇文章主要介绍了MySQL 分组查询的优化方法,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-05-05
  • MySQL一个语句查出各种整形占用字节数及最大最小值的实例

    MySQL一个语句查出各种整形占用字节数及最大最小值的实例

    下面小编就为大家带来一篇MySQL一个语句查出各种整形占用字节数及最大最小值的实例。
    2017-03-03

最新评论