SQL - DELETE JOIN
- SQL DELETE JOIN
- 带 WHERE 子句的 DELETE JOIN
- 关于 DELETE JOIN 的重要要点
SQL DELETE JOIN
SQL 中的 DELETE JOIN 用于根据涉及另一个表的条件从表中删除行。它将 DELETE 语句与 JOIN 结合使用,允许您针对两个或多个表之间匹配的特定行进行操作。
当您需要删除一个表中依赖于另一个表值的相关记录时,这非常有用。
语法
以下是 SQL DELETE JOIN 语句的基本语法:
DELETE table1, table2 FROM table1 JOIN table2 ON table1.common_field = table2.common_field WHERE table2.some_column = 'value';
这里所说的 JOIN,可以使用任何类型的 Join:常规 Join、Natural Join、Inner Join、Outer Join、Left Join、Right Join、Full Join 等。
示例
为了演示这个删除操作,我们必须先创建表并向其中插入数据。我们可以使用以下 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 | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 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 | DATE | CUSTOMER_ID | AMOUNT |
|---|---|---|---|
| 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 | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 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 | DATE | CUSTOMER_ID | AMOUNT |
|---|---|---|---|
| 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 可以与 WHERE 子句结合使用,以删除连接后满足特定条件的行。连接定义了表之间的关系,而 WHERE 子句进一步过滤应删除的行。
示例
在以下查询中,我们删除 CUSTOMERS 表中薪资低于 Rs. 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 | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 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 | DATE | CUSTOMER_ID | AMOUNT |
|---|---|---|---|
| 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 的重要要点
以下是使用 SQL 中的 DELETE JOIN 时需要了解的一些重要要点:
- DELETE JOIN 用于根据与另一个表的匹配条件从一个表中移除行。
- 您可以通过在 DELETE 语句中使用其别名来指定要删除的表。
- 它通常与 WHERE 子句结合使用,以过滤应删除的行。
- 不同 SQL 数据库(如 MySQL、SQL Server、PostgreSQL)的语法可能略有不同。
- 在执行 DELETE JOIN 之前,始终使用 SELECT 语句测试您的查询,以避免意外数据丢失。