SQL - DELETE JOIN



SQL 中的簡單刪除操作可以對錶的單條記錄或多條記錄執行。要從多個表中刪除記錄,最直接的方法是一次刪除一個表中的記錄。

但是,SQL 透過允許同時對多個表執行刪除操作來簡化此過程。這是使用連線實現的。

SQL DELETE... JOIN 子句

SQL 中連線的目的是基於公共列/欄位組合兩個或多個表中的記錄。一旦表連線,對獲得的結果集執行刪除操作將一次刪除所有原始表中的記錄。

例如,考慮一個教育機構的資料庫。它包含各種表:部門、學生詳細資訊、圖書館通行證、實驗室通行證等。當一組學生畢業時,需要從組織表中刪除他們的所有詳細資訊,因為這些資訊不再需要。但是,分別從多個表中刪除詳細資訊可能會很麻煩。

為了簡化操作,我們將首先使用**連線**從所有表中檢索所有畢業生的組合資料;然後,使用**DELETE**語句從此連線資料中刪除所有表中的資料。整個過程可以在單個查詢中完成。

語法

以下是 SQL DELETE... JOIN 語句的基本語法:

DELETE table(s)
FROM table1 JOIN table2
ON table1.common_field = table2.common_field;

這裡所說的連線,可以使用任何型別的連線:常規連線、自然連線、內部連線、外部連線、左連線、右連線、全連線等。

示例

為了演示此刪除操作,我們必須首先建立表並將值插入其中。我們可以使用如下所示的 CREATE TABLE 查詢建立這些表。

建立一個名為 CUSTOMERS 的表,其中包含客戶的個人詳細資訊,包括他們的姓名、年齡、地址和薪水等。使用以下查詢:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

現在,使用 INSERT 語句將值插入此表,如下所示:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

表將建立為:

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

讓我們建立另一個名為 ORDERS 的表,其中包含所做的訂單的詳細資訊以及訂單的日期。

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2)
);

使用 INSERT 語句,將值插入此表,如下所示:

INSERT INTO ORDERS VALUES 
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

表顯示如下:

OID 日期 客戶ID 金額
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

以下**DELETE... JOIN 查詢**一次從這些表中刪除記錄:

DELETE a
FROM CUSTOMERS AS a INNER JOIN ORDERS AS b
ON a.ID = b.CUSTOMER_ID;

輸出

輸出將在 SQL 中顯示如下:

Query OK, 3 rows affected (0.01 sec)

驗證

我們可以使用 SELECT 語句檢索表的內容來驗證更改是否已反映在表中,如下所示:

SELECT * FROM CUSTOMERS;

表顯示如下:

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

由於我們只從 CUSTOMERS 表中刪除了記錄,因此更改不會反映在 ORDERS 表中。我們可以使用以下查詢進行驗證。

SELECT * FROM ORDERS;

ORDERS 表顯示為:

OID 日期 客戶ID 金額
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

帶有 WHERE 子句的 DELETE... JOIN

DELETE... JOIN 查詢中的**ON**子句用於對記錄應用約束。除此之外,我們還可以使用 WHERE 子句使過濾更嚴格。觀察下面的查詢。在這裡,我們正在刪除**CUSTOMERS**表中薪水低於 2000.00 元的客戶的記錄。

DELETE a
FROM CUSTOMERS AS a INNER JOIN ORDERS AS b
ON a.ID = b.CUSTOMER_ID
WHERE a.SALARY < 2000.00;

輸出

執行查詢後,將顯示以下輸出。

Query OK, 1 row affected (0.01 sec)

驗證

我們可以使用 SELECT 語句檢索表的內容來驗證更改是否已反映在表中,如下所示:

SELECT * FROM CUSTOMERS;

刪除後 CUSTOMERS 表如下:

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

由於我們只從 CUSTOMERS 表中刪除了記錄,因此更改不會反映在 ORDERS 表中。我們可以使用以下查詢進行驗證:

SELECT * FROM ORDERS;

ORDERS 表顯示為:

OID 日期 客戶ID 金額
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00
廣告