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

相关文章

  • Windows10系统下Mysql8.0.13忘记root密码的操作方法

    Windows10系统下Mysql8.0.13忘记root密码的操作方法

    这篇文章主要给大家介绍了关于Windows10系统下Mysql8.0.13忘记root密码的操作方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • MySQL触发器trigger的使用

    MySQL触发器trigger的使用

    这篇文章主要介绍了MySQL触发器trigger的使用,触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • mysql主从只同步部分库或表的思路与方法

    mysql主从只同步部分库或表的思路与方法

    mysql主从搭建后默认同步所有库,同步原理是通过二进制日志方式传输,下面这篇文章主要给大家介绍了关于mysql主从只同步部分库或表的思路与方法,需要的朋友可以参考下
    2022-06-06
  • mysql解决时区相关问题

    mysql解决时区相关问题

    这篇文章主要介绍了mysql如何解决时区相关问题,本篇文章将从数据库参数入手,逐步介绍时区相关内容。感兴趣的朋友可以了解下
    2020-08-08
  • mysql实现合并同一ID对应多条数据的方法

    mysql实现合并同一ID对应多条数据的方法

    这篇文章主要介绍了mysql实现合并同一ID对应多条数据的方法,涉及mysql GROUP_CONCAT函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    这篇文章主要介绍了mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存),需要的朋友可以参考下
    2016-05-05
  • MySQL ddl语句的使用

    MySQL ddl语句的使用

    这篇文章主要介绍了MySQL ddl语句的使用,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-11-11
  • Mysql查询以某"字符串"开头的查询方式

    Mysql查询以某"字符串"开头的查询方式

    这篇文章主要介绍了Mysql查询以某"字符串"开头的查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 关于mysql数据库连接编码问题

    关于mysql数据库连接编码问题

    这篇文章主要介绍了关于mysql数据库连接编码问题,默认的编码和数据库表中的数据使用的编码是不一致的,如果是中文,那么在数据库中执行时已经是乱码了,需要的朋友可以参考下
    2023-04-04
  • 深入了解MySQL中索引优化器的工作原理

    深入了解MySQL中索引优化器的工作原理

    本文将解读MySQL数据库查询优化器(CBO)的工作原理。文中简单介绍了MySQL Server的组成,MySQL优化器选择索引额原理以及SQL成本分析,需要的可以参考一下
    2022-11-11

最新评论