1 學習參考 MySQL官方文檔 https://dev.mysql.com/doc/refman/8.0/en/delete.html 節選自 MySQL 8.0 Reference Manual_SQL Statements_Data Manipulation Statements_DELETE ...
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 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+----+------------------+
輸出:
+----+------------------+
| id | email |
+----+------------------+
| 1 | [email protected] |
| 2 | [email protected] |
+----+------------------+
解釋: [email protected]重覆兩次。我們保留最小的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;