首页 > 数据库 >MySQL 中 DELETE 语句中可以使用别名么?

MySQL 中 DELETE 语句中可以使用别名么?

时间:2024-04-15 19:56:02浏览次数:17  
标签:语句 name 别名 tbl MySQL table DELETE where delete

1 情境

delete 
from
  test1 t1 
where
  not exists ( select 1 from test2 t2 where t1.id = t2.id );

以上sql报错:
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

 2 分析

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

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

delete [low_priority] [quick] [ignore] from tbl_name
    [partition (partition_name [, partition_name] ...)]
    [where where_condition]
    [order by ...]
    [limit row_count]
-- 会发现并无表别名的使用

MySql 8.0版本单表delete语法如下:

delete [low_priority] [quick] [ignore] from tbl_name [[as] tbl_alias]
    [partition (partition_name [, partition_name] ...)]
    [where where_condition]
    [order by ...]
    [limit row_count]

MySql 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)

3 结论

  • MySQL 5.7 使用单表删除语句时,不能使用别名,多表删除可以使用别名;
  • MySQL 8.0.16 开始单表多表都可以使用别名。
  • 更多技术文章,请访问:https://opensource.actionsky.com/

4 关于SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE获取

类型 地址
版本库 https://github.com/actiontech/sqle
文档 https://actiontech.github.io/sqle-docs/
发布信息 https://github.com/actiontech/sqle/releases
数据审核插件开发文档 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

原文链接:https://blog.csdn.net/ActionTech/article/details/134555384

标签:语句,name,别名,tbl,MySQL,table,DELETE,where,delete
From: https://www.cnblogs.com/daytoy105/p/18136764

相关文章

  • Winodows安装Mysql 8.0.36 简单教程
    下载https://dev.mysql.com/downloads/mysql/选择下载简单版本即可安装1.解压将下载下来的安装包进行解压2.mysql初始化用cmd进入的mysql的解压包的bin目录里,执行初始化命令mysqld--initialize--console记录一下mysql初始化密码,备用。3.启动mysqlnetstartmy......
  • MySQL锁、事务和索引
    并发事务的控制方式是MVCC和行锁按范围分:表级锁、页锁、行级锁(锁一行或者多行)(记录索、间隙锁、临键锁(可重复读默认用这个做行锁,除非是主键和唯一索引会使用记录索))按功能分:读锁(S)、写锁(X)意向锁是表级锁,分为意向共享锁、意向排他锁,用于协调表锁和行锁的关系,事务想要在某些行上加共......
  • MySQL优化:索引
    1、谈一下你对于mysql索引的理解?(为什么mysql要选择B+树来存储索引)​ mysql的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单点来说就是可以保证在树的高度不变的情况下可以存储更多的数据:​ 1、在MYSQL的数据库中,表的真实数据和......
  • Mysql安装和远程登录--Centos7
    在Centos7中使用的包管理工具是yum,当然使用包管理工具安装也是最方便的。本文操作内容需要在root用户下,否则有些步骤无法成功执行。系统环境信息展示安装MySQL提供的RPMwgethttps://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm检查是否下载成功......
  • mysql的分区之key,hash分区
    1.hash分区HASH分区主要用来确保数据在预先确定数目的分区中平均分布,要做的只是基于将要被哈希的列值指定一个列值或表达式,以及指定被分区的表将要被分割成的分区数量。hash分区所使用的字段一定要是主键!!createtable表名(.........)engine=MyISAMpartitionbyhash(算......
  • 淘宝二面:MySQL里有2000万条数据,但是Redis中只存20万的数据,如何保证redis中的数据都是
    引言在当今互联网领域,尤其在大型电商平台如淘宝这样的复杂分布式系统中,数据的高效管理和快速访问至关重要。面对数以千万计的商品、交易记录以及其他各类业务数据,如何在MySQL等传统关系型数据库之外,借助内存数据库Redis的力量,对部分高频访问数据进行高效的缓存处理,是提升整个系统......
  • mysql交换两列数据
    mysql交换两列数据某ai上居然给出了下面这个语句,这语句是错误的,会把两列换成一样的数据UPDATEt_aSETcol1=col2,col2=col1;下面的语句是可行的updatet_aasa,t_basbseta.col1=b.col2,a.col2=b.col1wherea.id=b.id;下面是使用临时变......
  • .net core EF mysql 共享事务
     .netcoreEFmysql共享事务在.NETCore中使用EntityFramework(EF)Core与MySQL一起工作时,您可以使用System.Transactions的TransactionScope来创建一个可以跨多个数据库连接共享的事务。以下是一个简单的示例,展示了如何在.NETCore应用程序中使用EntityFramewo......
  • MySQL概述以及MySQL的安装以及启动
    一、数据库的相关概念数据库Database,简称DB。按照一定的数据结构来组织、存储和管理数据的仓库。数据库管理系统DatabaseManagementSystem,一种操纵和管理数据库的大型软件,用于创建、使用和维护数据库,简称DBMS。  关系型数据库(RDBMS)概念:关系型数据库,是建立在关系模型......
  • mysql中文全文索引的记录
    在MySQL5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。从MySQL5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。创建示例--创建表格CREATETABLEarticles(idINTAUTO_INCREME......