MySQL删除连接
总结:在本教程中,我们将向您展示如何使用**MySQL DELETE JOIN **语句从多个表中删除数据。
在上一个教程中,您学习了如何使用以下方法删除多个表的行:
DELETE对多个表的单个语句。DELETE对多个相关表的单个语句,其中子表对外键具有ON DELETE CASCADE引用操作。
本教程向您介绍了一种更灵活的方法,可以使用 INNER JOIN or 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 和。如果省略table,则该语句仅删除table 中的行 。同样,如果省略table,该语句将仅删除table 中的行 。 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);

下面的语句删除ID为1行中的 t1 表,并也排 ref 在1 t2 使用表 DELETE...INNER JOIN 的语句:
DELETE t1,t2 FROM t1
INNER JOIN
t2 ON t2.ref = t1.id
WHERE
t1.id = 1;
该语句返回以下消息:
2 row(s) affected
它表示已删除两行。
MySQL DELETE JOIN 与 LEFT JOIN
我们经常在 LEFT JOIN 语句中使用 子句 SELECT 来查找左表中是否有右表中匹配行的行。
我们也可以使用 LEFT JOIN 语句中的子句 DELETE 来删除一个表(左表)中没有另一个表(右表)中匹配行的行。
以下语法说明了如何使用 DELETE 带有 LEFT JOIN 子句的语句从 T1 表中删除表中没有对应行的行 T2 :
DELETE T1
FROM T1
LEFT JOIN
T2 ON T1.key = T2.key
WHERE
T2.key IS NULL;
请注意,我们只将 T1 table放在 DELETE 关键字之后,而不是像我们在子句中所做的那样同时放置 T1 和 T2 表 INNER JOIN 。
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 语句从两个或多个表中删除数据。