MySQL delete join語句

2019-10-16 22:57:24

在本教學中,我們將向您展示如何使用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範例

在範例資料庫(yiibaidb)中檢視以下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語句從兩個或多個表中刪除資料。