IT评测·应用市场-qidao123.com

标题: SQL_DML_Multiple-table Delete 多表删除的用法 [打印本页]

作者: 怀念夏天    时间: 2022-8-18 12:56
标题: SQL_DML_Multiple-table Delete 多表删除的用法
1 学习参考

2 LeetCode 题目

题目
  1. Person表
  2. +-------------+---------+
  3. | Column Name | Type    |
  4. +-------------+---------+
  5. | id          | int     |
  6. | email       | varchar |
  7. +-------------+---------+
  8. id是该表的主键列。该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
复制代码
要求
编写一个 SQL 删除语句来删除所有重复的电子邮件,只保留一个id 最小的唯一电子邮件。以任意顺序返回结果表。(注意:仅需要写删除语句)
示例
  1. 输入:
  2. Person 表
  3. +----+------------------+
  4. | id | email            |
  5. +----+------------------+
  6. | 1  | john@example.com |
  7. | 2  | bob@example.com  |
  8. | 3  | john@example.com |
  9. +----+------------------+
  10. 输出:
  11. +----+------------------+
  12. | id | email            |
  13. +----+------------------+
  14. | 1  | john@example.com |
  15. | 2  | bob@example.com  |
  16. +----+------------------+
  17. 解释: john@example.com重复两次。我们保留最小的Id = 1。
复制代码
用 Multiple-table Delete 解答
  1. DELETE
  2.         p1
  3. FROM
  4.         Person p1, p2
  5. WHERE
  6.         p1.Email = p2.Email AND p1.Id > p2.Id
复制代码
3 多表删除的用法

3.1 Multiple-Table Syntax(多表语法)

第1种DELETE语句
  1.         DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
  2.                 tbl_name[.*] [, tbl_name[.*]] ...
  3.                 FROM table_references   
  4.                 [WHERE where_condition]
复制代码
第2种DELETE语句
  1.         DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
  2.                 FROM tbl_name[.*] [, tbl_name[.*]] ...
  3.                 USING table_references   
  4.                 [WHERE where_condition]
复制代码
3.2 Multi-Table Deletes(多表删除)

你可以在一个 DELETE 语句中指定多个表,根据 WHERE 子句中的条件,从一个或多个表中删除记录。你不能在多表DELETE 语句中使用 ORDER BY 或 LIMIT。table_references子句列出了参与连接的表。
这些语句在 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部分声明。在其他地方,允许引用别名,但不允许声明别名。
正确:
  1. DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2
  2. WHERE a1.id=a2.id;
  3. DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2
  4. WHERE a1.id=a2.id;
复制代码
错误:
  1. DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2
  2. WHERE a1.id=a2.id;
  3. DELETE FROM t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2
  4. WHERE a1.id=a2.id;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4