MySQL DELETE JOIN
简介:在本教程中,我们将向您展示如何使用MySQL DELETE JOIN 语句从多个表中删除数据。 在上一个教程中,您学习了如何使用以下方法删除多个表的行:
- 在多个表上使用的单个
DELETE语句。 - 关于多个相关表的单个
DELETE语句,子表具有对外键的ON DELETE CASCADE引用操作。
INNER JOIN或LEFT JOIN子句和DELETE语句从多个表中删除数据的更灵活方法。
MySQL DELETE JOIN与INNER JOIN
MySQL还允许您使用INNER JOIN语句中的子句DELETE删除表中的行和另一个表中的匹配行。
例如,要删除两行T1,并T2满足指定条件表,使用下面的语句:
DELETE T1, T2 FROM T1 INNER JOIN T2 ON T1.key = T2.key WHERE condition;
注意:您把表名
表达式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);

t1表中id为1的行,并使用DELETE...INNER JOIN语句删除在t2表中ref = 1的行 :
DELETE t1,t2 FROM t1
INNER JOIN
t2 ON t2.ref = t1.id
WHERE
t1.id = 1;
声明返回以下消息:
2 row(s) affected它表明已删除了两行。
MySQL使用LEFT JOIN删除JOIN
我们经常使用SELECT语句中的 LEFT JOIN子句来查找左表中的行,这些行在右表中有或没有匹配的行。
我们还可以使用DELETE语句中的LEFT JOIN子句删除表(左表)中的行,这些行在另一个表(右表)中没有匹配的行。
以下语法说明如何使用DELETE语句中 LEFT JOIN子句从T1表中删除T2表中没有相应行的行:
DELETE T1
FROM T1
LEFT JOIN
T2 ON T1.key = T2.key
WHERE
T2.key IS NULL;
注意:我们只把
T1表放在DELETE的关键字后面,而不像我们用在使用 INNER JOIN子句那样T1和T2两个表。
MySQL DELETE JOIN与LEFT JOIN示例
请参阅示例数据库中的以下内容customers和orders表:

DELETE和 LEFT JOIN子句来清理客户主数据。以下语句删除未下订单的客户:
DELETE customers
FROM customers
LEFT JOIN
orders ON customers.customerNumber = orders.customerNumber
WHERE
orderNumber IS NULL;
我们可以通过使用以下查询查找是否存在任何订单的客户来验证删除:
SELECT
c.customerNumber,
c.customerName,
orderNumber
FROM
customers c
LEFT JOIN
orders o ON c.customerNumber = o.customerNumber
WHERE
orderNumber IS NULL;
查询返回了一个空结果集,这是我们所期望的。
在本教程中,您学习了如何使用MySQL DELETE JOIN 语句从两个或多个表中删除数据。
