摘要:在本教程中,我们将向您展示如何使用MySQL DELETE JOIN语句从多个表中删除数据。
在上一教程中,您学习了如何使用以下方法删除多个表的行:
- 多个表上的单个
DELETE
语句。 - 对多个相关表执行单个
DELETE
语句,其中子表具有外键的ON DELETE CASCADE
引用操作。
本教程向您介绍一种更灵活的方法,使用INNER JOIN
或LEFT JOIN
子句与DELETE
语句从多个表中删除数据。
MySQL DELETE JOIN
与INNER JOIN
MySQL 还允许您在DELETE
语句中使用INNER JOIN
子句来删除一个表中的行以及另一个表中的匹配行。
例如,要从T1
和T2
表中删除满足指定条件的行,请使用以下语句:
DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;
Code language: SQL (Structured Query Language) (sql)
请注意,您将表名T1
和T2
放在DELETE
和FROM
关键字之间。如果省略T1
表,则DELETE
语句仅删除T2
表中的行。同样,如果省略T2
表, DELETE
语句将仅删除T1
表中的行。
表达式T1.key = T2.key
指定T1
和T2
表之间将被删除的匹配行的条件。
WHERE
子句中的条件确定T1
和T2
中将被删除的行。
MySQL DELETE JOIN
与INNER JOIN
示例
假设我们有两个表t1
和t2
,其结构和数据如下:
DROP TABLE IF EXISTS t1, t2;
CREATE TABLE t1 (
id INT PRIMARY KEY AUTO_INCREMENT
);
CREATE TABLE t2 (
id VARCHAR(20) PRIMARY KEY,
ref INT NOT NULL
);
INSERT INTO t1 VALUES (1),(2),(3);
INSERT INTO t2(id,ref) VALUES('A',1),('B',2),('C',3);
Code language: SQL (Structured Query Language) (sql)

以下语句使用DELETE...INNER JOIN
语句删除t1
表中 id 为 1 的行以及t2
表中ref
1 的行:
DELETE t1,t2 FROM t1
INNER JOIN
t2 ON t2.ref = t1.id
WHERE
t1.id = 1;
Code language: SQL (Structured Query Language) (sql)
该声明返回以下消息:
2 row(s) affected
Code language: SQL (Structured Query Language) (sql)
它表明两行已被删除。
MySQL DELETE JOIN
和LEFT JOIN
我们经常在SELECT
语句中使用LEFT JOIN
子句来查找左表中与右表中是否有匹配行的行。
我们还可以在DELETE
语句中使用LEFT JOIN
子句来删除表(左表)中与另一个表(右表)中没有匹配行的行。
以下语法说明如何使用带有LEFT JOIN
子句的DELETE
语句从T1
表中删除在T2
表中没有对应行的行:
DELETE T1
FROM T1
LEFT JOIN
T2 ON T1.key = T2.key
WHERE
T2.key IS NULL;
Code language: SQL (Structured Query Language) (sql)
请注意,我们只将T1
表放在DELETE
关键字之后,而不是像我们对INNER JOIN
子句所做的那样将T1
和T2
表放在一起。
MySQL DELETE JOIN 和 LEFT JOIN 示例
请参阅示例数据库中的以下customers
和orders
表:

每个客户有零个或多个订单。然而,每个订单只属于一个且仅一个客户。
我们可以使用带有LEFT JOIN
子句的DELETE
语句来清理客户主数据。以下语句删除未下订单的客户:
DELETE customers
FROM customers
LEFT JOIN
orders ON customers.customerNumber = orders.customerNumber
WHERE
orderNumber IS NULL;
Code language: SQL (Structured Query Language) (sql)
我们可以通过使用以下查询查找是否存在没有任何订单的客户来验证删除:
SELECT
c.customerNumber,
c.customerName,
orderNumber
FROM
customers c
LEFT JOIN
orders o ON c.customerNumber = o.customerNumber
WHERE
orderNumber IS NULL;
Code language: SQL (Structured Query Language) (sql)
查询返回一个空结果集,这正是我们所期望的。
在本教程中,您学习了如何使用 MySQL DELETE JOIN
语句从两个或多个表中删除数据。