MySQL delete join語句

在本教學中,我們將向您展示如何使用MySQL DELETE JOIN語句來從多個表中刪除數據。

在上一個教程中,我們學習了如何使用以下方式刪除多個表的行記錄:

本教程將介紹一種使用INLEER JOINLEFT JOIN子句與DELETE語句從多個表中刪除數據的更靈活的方法。

MySQL DELETE語句使用INNER JOIN子句

MySQL還允許在DELETE語句中使用INNER JOIN子句來從表中刪除和另一個表中的匹配的行記錄。

例如,要從符合指定條件的T1T2表中刪除行記錄,請使用以下語句:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition

請注意,將T1T2表放在DELETEFROM關鍵字之間。如果省略T1表,DELETE語句僅刪除T2表中的行記錄。 同樣,如果省略了T2表,DELETE語句將只刪除T1表中的行記錄。

運算式T1.key = T2.key指定了將被刪除的T1T2表之間的匹配行記錄的條件。

WHERE子句中的條件確定T1T2表中要被刪除的行記錄。

MySQL DELETE語句使用INNER JOIN示例

假設有兩個表t1t2,其結構和數據如下:

USE testdb;

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(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 DELETE與LEFT JOIN子句

我們經常在SELECT語句中使用LEFT JOIN子句來查找左表中以及右表中不匹配行的行記錄。

我們還可以在DELETE語句中使用LEFT JOIN子句刪除表(左表)中沒有與其他表(右表)中的匹配的行記錄。

以下語法說明如何使用DELETE語句與LEFT JOIN子句來刪除與T2表中沒有相應匹配行的表T1中的行記錄:

DELETE T1
FROM T1
        LEFT JOIN
    T2 ON T1.key = T2.key
WHERE
    T2.key IS NULL;

請注意,我們只將T1表放在DELETE關鍵字之後,而不是像INNER JOIN子句那樣使用兩個表名:T1T2

MySQL DELETE連接LEFT JOIN示例

在示例資料庫(zaixiandb)中查看以下ordersorderdetails表:

每個客戶都有零個或多個訂單。 但是,每個訂單都屬於唯一的一個客戶。

可以使用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語句從兩個或多個表中刪除數據。


上一篇: MySQL刪除表數據 下一篇: MySQL創建與刪除資料庫