SQL DELETE JOIN子句

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;

当我们在这里说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, 'MP', 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 MP 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

下面的< b > 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 MP 4500.00
7 Muffy 24 Indore 10000.00

由于我们只从CUSTOMERS表中删除了记录,所以这些更改不会反映在ORDERS表中。我们可以使用以下查询来验证。

SELECT * FROM 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 WHERE子句

在DELETE…JOIN查询中使用的 ON 子句,用于对记录应用约束。除此之外,我们还可以使用WHERE子句使过滤更严格。请注意下面的查询;在这里,我们正在删除工资低于2000.00卢比的客户记录,其中表 CUSTOMERS 中的记录。

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 MP 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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程