单表语法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
多表语法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*] ...]
FROM table_references
[WHERE where_definition]
或:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*] ...]
USING table_references
[WHERE where_definition]
tbl_name中有些行满足由where_definition给定的条件。DELETE用于删除这些行,并返回被删除的记录的数目。

如果您编写的DELETE语句中没有WHERE子句,则所有的行都被删除。当您不想知道被删除的行的数目时,有一个更快的方法,即使用TRUNCATE TABLE。

如果您删除的行中包括用于AUTO_INCREMENT列的最大值,则该值被重新用于BDB表,但是不会被用于MyISAM表或InnoDB表。如果您在AUTOCOMMIT模式下使用DELETE FROM tbl_name(不含WHERE子句)删除表中的所有行,则对于所有的表类型(除InnoDB和MyISAM外),序列重新编排。对于InnoDB表,此项操作有一些例外。

对于MyISAM和BDB表,您可以把AUTO_INCREMENT次级列指定到一个多列关键字中。在这种情况下,从序列的顶端被删除的值被再次使用,甚至对于MyISAM表也如此。DELETE语句支持以下修饰符:

· 如果您指定LOW_PRIORITY,则DELETE的执行被延迟,直到没有其它客户端读取本表时再执行。

· 对于MyISAM表,如果您使用QUICK关键词,则在删除过程中,存储引擎不会合并索引端结点,这样可以加快部分种类的删除操作的速度。

· 在删除行的过程中,IGNORE关键词会使MySQL忽略所有的错误。(在分析阶段遇到的错误会以常规方式处理。)由于使用本选项而被忽略的错误会作为警告返回。

删除操作的速度会受到一些因素的影响,这些因素在7.2.18节,“DELETE语句的速度”中进行了讨论。

在MyISAM表中,被删除的记录被保留在一个带链接的清单中,后续的INSERT操作会重新使用旧的记录位置。要重新使用未使用的空间并减小文件的尺寸,则使用OPTIMIZE TABLE语句或myisamchk应用程序重新编排表。OPTIMIZE TABLE更简便,但是myisamchk速度更快。请参见13.5.2.5节,“OPTIMIZE TABLE语法”和第7章:优化。

QUICK修饰符会影响到在删除操作中索引端结点是否合并。当用于被删除的行的索引值被来自后插入的行的相近的索引值代替时,DELETE QUICK最为适用。在此情况下,被删除的值留下来的空穴被重新使用。

未充满的索引块跨越某一个范围的索引值,会再次发生新的插入。当被删除的值导致出现未充满的索引块时,DELETE QUICK没有作用。在此情况下,使用QUICK会导致未利用的索引中出现废弃空间。下面是此种情况的举例说明:

1. 创建一个表,表中包含已编索引的AUTO_INCREMENT列。

2. 在表中插入很多记录。每次插入会产生一个索引值,此索引值被添加到索引的高端处。

3. 使用DELETE QUICK从列的低端处删除一组记录。

在此情况下,与被删除的索引值相关的索引块变成未充满的状态,但是,由于使用了QUICK,这些索引块不会与其它索引块合并。当插入新值时,这些索引块仍为未充满的状态,原因是新记录不含有在被删除的范围内的索引值。另外,即使您此后使用DELETE时不包含QUICK,这些索引块也仍是未充满的,除非被删除的索引值中有一部分碰巧位于这些未充满的块的之中,或与这些块相邻。在这些情况下,如果要重新利用未使用的索引空间,需使用OPTIMIZE TABLE。

如果您打算从一个表中删除许多行,使用DELETE QUICK再加上OPTIMIZE TABLE可以加快速度。这样做可以重新建立索引,而不是进行大量的索引块合并操作。

用于DELETE的MySQL唯一的LIMIT row_count选项用于告知服务器在控制命令被返回到客户端前被删除的行的最大值。本选项用于确保一个DELETE语句不会占用过多的时间。您可以只重复DELETE语句,直到相关行的数目少于LIMIT值为止。

如果DELETE语句包括一个ORDER BY子句,则各行按照子句中指定的顺序进行删除。此子句只在与LIMIT联用是才起作用。例如,以下子句用于查找与WHERE子句对应的行,使用timestamp_column进行分类,并删除第一(最旧的)行:

DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp_column
LIMIT 1;
您可以在一个DELETE语句中指定多个表,根据多个表中的特定条件,从一个表或多个表中删除行。不过,您不能在一个多表DELETE语句中使用ORDER BY或LIMIT。

table_references部分列出了包含在联合中的表。此语法在13.2.7.1节,“JOIN语法”中进行了说明。

对于第一个语法,只删除列于FROM子句之前的表中的对应的行。对于第二个语法,只删除列于FROM子句之中(在USING子句之前)的表中的对应的行。作用是,您可以同时删除许多个表中的行,并使用其它的表进行搜索:

DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
或:

DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
当搜索待删除的行时,这些语句使用所有三个表,但是只从表t1和表t2中删除对应的行。

以上例子显示了使用逗号操作符的内部联合,但是多表DELETE语句可以使用SELECT语句中允许的所有类型的联合,比如LEFT JOIN。

本语法允许在名称后面加.*,以便与Access相容。

如果您使用的多表DELETE语句包括InnoDB表,并且这些表受外键的限制,则MySQL优化程序会对表进行处理,改变原来的从属关系。在这种情况下,该语句出现错误并返回到前面的步骤。要避免此错误,您应该从单一表中删除,并依靠InnoDB提供的ON DELETE功能,对其它表进行相应的修改。

注释:当引用表名称时,您必须使用别名(如果已给定):

DELETE t1 FROM test AS t1, test2 WHERE ...
进行多表删除时支持跨数据库删除,但是在此情况下,您在引用表时不能使用别名。举例说明:

DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...
目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。

MYSQL DELETE语法相关推荐

  1. mysql delete 语法_MySQL DELETE 语句

    MySQL DELETE 语句 你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录. 你可以在mysql>命令提示符或PHP脚本中执行该命令. 语法 以下是S ...

  2. mysql用delete详解_MySQL DELETE语法使用详细解析

    该文章转自:http://www.jb51.net/article/35071.htm 以下的文章主要描述的是MySQL DELETE语法的详细解析,首先我们是从单表语法与多表语法的示例开始的,假如你 ...

  3. MySQL之语法入门与基础命令

    一.MySQL SELECT语句 SELECT语句是控制查看哪些列和行数据,具体如下: SELECT column_1, column_2, ... FROMtable_1 [INNER | LEFT ...

  4. MYSQL常用语法命令,MySQL中delete,drop和alter分别是用来删除什么的?有什么区别?删除了以后可以恢复吗?

    1.Alter.Delete.Drop相关语法 a.Alter 删除,添加或重新定义列 删除列:alter table tablename drop columnname 增加列:alter tabl ...

  5. mysql delete join语法_mysql之delete语法

    一:DELETE语法 以往用delect删除表数据是都是单表(一个表)删除.对于关联表,往往都是先删除第一个表的数据,然后再写另一个delect语句删除另一个表的数据(浪费时间,又影响性能,与数据库交 ...

  6. MYSQL基础语法的使用

    喜欢的朋友可以关注下,粉丝也缺. MYSQL介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之 ...

  7. MySQL DELETE:删除数据

    在 MySQL 中,可以使用 DELETE 语句来删除表的一行或者多行数据. 删除单个表中的数据 使用 DELETE 语句从单个表中删除数据,语法格式为: DELETE FROM <表名> ...

  8. mysql grant 语法格式_MySQL grant 语法的详细解析

    我们今天主要向大家介绍的是MySQL grant 语法的详细解析,同时本文还介绍了其实际应用代码的介绍,希望在你今后的学习中会有所帮助. 以下的文章是MySQL grant 语法的详细解析,如果你对M ...

  9. mysql delete in 结果集_MySQL从删库到跑路(2)SQL语句示例

    注意:此文章仅罗列部分指令及sql语句,并且某些语句并不完整与严谨,仅供参考以及示例所用,详细内容可以查阅官方文档. 1.创建test数据库 create database test; 2.删除数据库 ...

最新文章

  1. 第8集析构函数中抛出的异常
  2. Java数据结构Map遍历和排序
  3. Django从理论到实战(part45)--下载CSV文件
  4. android studio 帧动画,如何在android studio中的两帧动画之间添加延迟?
  5. CentOS 7.2下ELK分析Nginx日志生产实战(高清多图)
  6. 力扣题目系列:474. 一和零
  7. 阶段3 1.Mybatis_02.Mybatis入门案例_2.mybatis入门案例中的设计模式分析
  8. 【docx4j】docx4j操作docx,实现替换内容、转换pdf、html等操作
  9. Windows10下下载安装ideaIU
  10. 谷歌(google)、百度、必应d等高级搜索指令使用
  11. oracle 波浪号不识别,键盘波浪号“~”打不出,一直打成±,但安全模式却正常打出...
  12. 小鑫の日常系列故事(一)——判断对错
  13. 网络服务器的配置与管理
  14. 瀚高数据库适配定时框架Quartz
  15. C语言——兔子繁殖问题多解
  16. Appium+python自动化(三十八) - Appium自动化测试框架综合实践 - 框架简介-助你冲击高薪,迎娶白富美(超详解)...
  17. 视频剪辑3.5版-一分钟生成上百个电影混剪视频
  18. 成为一名合格的软件测试工程师,需要具备哪些技能?
  19. 如何将深度学习模型加载到android环境中
  20. 探索艾利特机器人|EC66机器人在生猪疫苗注射中的应用

热门文章

  1. 数组和list之间的相互转换
  2. C语言编写的文本文件/二进制文件格式互换
  3. 【linux】持续集成与持续发布CICD
  4. Python一些可能用的到的函数系列11 本地哈希和服务器哈希比对
  5. 基于WEB开发的高校学籍管理系统设计与实现
  6. 怎么将PPT里面的普通文字设置成艺术文字
  7. 数字电路逻辑电路-实验一(逻辑门的应用及相互转换)
  8. 3DMax基础操作快捷键
  9. 创建koa2项目步骤
  10. 【web系列十五】Ubuntu系统部署Web项目