1 学习参考
- MySQL官方文档
https://dev.mysql.com/doc/refman/8.0/en/delete.html - 节选自
MySQL 8.0 Reference Manual_SQL Statements_Data Manipulation Statements_DELETE Statement - 原文知识点
Multiple-Table Syntax(多表语法)、Multi-Table Deletes(多表删除) - 请注意
详细的拓展知识点请参考原文
2 LeetCode 题目
题目
Person表
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| email | varchar |
+-------------+---------+
id是该表的主键列。该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
要求
编写一个 SQL 删除语句来删除所有重复的电子邮件,只保留一个id 最小的唯一电子邮件。以任意顺序返回结果表。(注意:仅需要写删除语句)
示例
输入:
Person 表
+----+------------------+
| id | email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+------------------+
输出:
+----+------------------+
| id | email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
+----+------------------+
解释: john@example.com重复两次。我们保留最小的Id = 1。
用 Multiple-table Delete 解答
DELETE
p1
FROM
Person p1, p2
WHERE
p1.Email = p2.Email AND p1.Id > p2.Id
3 多表删除的用法
3.1 Multiple-Table Syntax(多表语法)
第1种DELETE语句
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*]] ...
FROM table_references
[WHERE where_condition]
第2种DELETE语句
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*]] ...
USING table_references
[WHERE where_condition]
3.2 Multi-Table Deletes(多表删除)
你可以在一个 DELETE 语句中指定多个表,根据 WHERE 子句中的条件,从一个或多个表中删除记录。你不能在多表DELETE 语句中使用 ORDER BY 或 LIMIT。table_references子句列出了参与连接的表。
-
对于第一种多表语法,只有在 FROM 子句前列出的表中的匹配记录被删除。
-
对于第二种多表语法,只有从 FROM 子句中列出的表(在 USING 子句之前)的匹配记录被删除。这样做的效果是,你可以同时从许多表中删除记录,并且有额外的表只用于搜索。
DELETE t1 FROM t1 INNER JOIN t2 WHERE t1.id=t2.id;
或者
DELETE FROM t1, USING t1 INNER JOIN t2 WHERE t1.id=t2.id ;
这些语句在 t1、t2 两个表中搜索要删除的记录,但是只从表t1中删除匹配的记录。
前面的例子使用了INNER JOIN。
请注意 !!!
很多地方会使用省略的写法:FROM t1, t2
,这和FROM t1 INNER JOIN t2
是一样的。
多表 DELETE 语句也可以使用SELECT语句中允许的其他类型的连接,例如 LEFT JOIN。例如,要删除存在于t1中但在t2中没有匹配的记录,可以使用LEFT JOIN:DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
注意 !!!
如果你为一个表声明了一个别名,你在引用该表时必须使用该别名。
DELETE t1 FROM test AS t1, test2 WHERE ...
多表 DELETE中 的表别名应该只在语句的table_references部分声明。在其他地方,允许引用别名,但不允许声明别名。
正确:
DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2
WHERE a1.id=a2.id;
DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2
WHERE a1.id=a2.id;
错误:
DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2
WHERE a1.id=a2.id;
DELETE FROM t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2
WHERE a1.id=a2.id;
来源:https://www.cnblogs.com/BodhiLeaf/p/16414941.html
本站部分图文来源于网络,如有侵权请联系删除。