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
语句从两个或多个表中删除数据。