在本教學中,我們將向您展示如何使用MySQL DELETE JOIN
語句來從多個表中刪除資料。
在上一個教學中,我們學習了如何使用以下方式刪除多個表的行記錄:
在多個表上使用單個DELETE語句刪除資料。
多個相關表上的使用單個DELETE
語句,子表具有對外來鍵的ON DELETE CASCADE參照操作。
本教學將介紹一種使用INLEER JOIN或LEFT JOIN子句與DELETE
語句從多個表中刪除資料的更靈活的方法。
MySQL還允許在DELETE
語句中使用INNER JOIN
子句來從表中刪除和另一個表中的匹配的行記錄。
例如,要從符合指定條件的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
表中要被刪除的行記錄。
假設有兩個表t1
和t2
,其結構和資料如下:
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
它表示一共有兩行記錄已被刪除了。
我們經常在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
子句那樣使用兩個表名:T1
和T2
。
在範例資料庫(yiibaidb
)中檢視以下orders
和orderdetails
表:
每個客戶都有零個或多個訂單。 但是,每個訂單都屬於唯一的一個客戶。
可以使用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
語句從兩個或多個表中刪除資料。