MySQL DELETE JOIN

摘要:在本教程中,我们将向您展示如何使用MySQL DELETE JOIN语句从多个表中删除数据。

在上一教程中,您学习了如何使用以下方法删除多个表的行:

本教程向您介绍一种更灵活的方法,使用INNER JOINLEFT JOIN子句与DELETE语句从多个表中删除数据。

MySQL DELETE JOININNER JOIN

MySQL 还允许您在DELETE语句中使用INNER JOIN子句来删除一个表中的行以及另一个表中的匹配行。

例如,要从T1T2表中删除满足指定条件的行,请使用以下语句:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;Code language: SQL (Structured Query Language) (sql)

请注意,您将表名T1T2放在DELETEFROM关键字之间。如果省略T1表,则DELETE语句仅删除T2表中的行。同样,如果省略T2表, DELETE语句将仅删除T1表中的行。

表达式T1.key = T2.key指定T1T2表之间将被删除的匹配行的条件。

WHERE子句中的条件确定T1T2中将被删除的行。

MySQL DELETE JOININNER JOIN示例

假设我们有两个表t1t2 ,其结构和数据如下:

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)
MySQL DELETE JOIN

以下语句使用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) affectedCode language: SQL (Structured Query Language) (sql)

它表明两行已被删除。

MySQL DELETE JOINLEFT 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子句所做的那样将T1T2表放在一起。

MySQL DELETE JOIN 和 LEFT JOIN 示例

请参阅示例数据库中的以下customersorders表:

Customers and Orders Tables

每个客户有零个或多个订单。然而,每个订单只属于一个且仅一个客户。

我们可以使用带有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语句从两个或多个表中删除数据。

本教程有帮助吗?