SQL DELETE查询
SQL DELETE 语句
SQL DELETE 语句用于从现有表中删除记录。为了筛选要删除的记录(或者删除特定记录),我们需要使用 WHERE 子句和DELETE语句。
如果执行DELETE语句时没有使用WHERE子句,它将删除表中的所有记录。
使用DELETE语句,我们可以删除单个表的一个或多个行以及多个表的记录。
语法
带有WHERE子句的SQL DELETE查询的基本语法如下所示−
DELETE FROM table_name WHERE [condition];
您可以使用AND或OR运算符来组合N个条件。
示例
假设我们创建了一个名为 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 (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'Hyderabad', 4500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (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 |
以下查询删除了ID为6的客户的记录。
DELETE FROM CUSTOMERS WHERE ID = 6;
输出
输出结果如下 –
Query OK, 1 row affected (0.10 sec)
验证
为了验证记录是否已从表中删除,我们需要使用SELECT查询检索修改后的表格,如下所示:
SELECT * FROM CUSTOMERS;
现在,CUSTOMERS表将具有以下记录−
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 |
7 | Muffy | 24 | Indore | 10000.00 |
删除多行
要从表中删除多行,我们需要使用WHERE子句来指定满足所有要删除行的条件。让我们看一个例子:
示例
从相同的Customers表中,让我们试着删除年龄超过25岁的顾客的记录。
DELETE FROM CUSTOMERS WHERE AGE > 25;
输出
输出将会显示为 −
Query OK, 2 rows affected (0.06 sec)
验证
为了验证记录是否已从表中删除,请让我们检索修改过的表。为此,请使用下面的SELECT查询:
SELECT * FROM CUSTOMERS;
上述查询将生成以下表格-
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
2 | Khilan | 25 | Delhi | 1500.00 |
3 | kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
从表中删除所有记录
如果我们想要使用DELETE查询从现有表中删除所有记录(截断表),我们只需要在查询中不使用WHERE子句即可。
示例
以下SQL查询从CUSTOMERS表中删除所有记录-
DELETE FROM CUSTOMERS;
输出
输出结果将显示为−
Query OK, 4 rows affected (0.13 sec)
验证
为了验证表中的所有记录是否已删除,我们需要再次使用SELECT查询检索修改后的表-
SELECT * FROM CUSTOMERS;
现在,CUSTOMERS表将不包含任何记录,并将显示以下输出 –
Empty set (0.00 sec)
删除多个表中的记录
SQL允许我们使用DELETE查询从多个表中删除记录。在这里,我们将使用JOIN子句基于一个公共列来合并来自多个表的数据。
示例
让我们创建另一个名为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 (OID, DATE, CUSTOMER_ID, AMOUNT) 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 |
以下SQL查询删除了那些收入超过2000并且有下过订单的客户的记录(来自CUSTOMERS表和ORDERS表) −
DELETE CUSTOMERS, ORDERS FROM CUSTOMERS
INNER JOIN ORDERS ON ORDERS.CUSTOMER_ID = CUSTOMERS.ID
WHERE CUSTOMERS.SALARY > 2000;
输出
输出将以如下方式显示:
Query OK, 2 rows affected (0.01 sec)
验证
要验证记录是否已从表中删除,我们需要再次使用SELECT查询检索修改后的表。
SELECT * FROM CUSTOMERS;
CUSTOMERS表中没有工资大于2000并且ID与ORDERS表中的CUSTOMER_ID列匹配的记录。
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | kaushik | 23 | Kota | 2000.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | MP | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
同样,如果你验证ORDERS表如下所示 –
SELECT * FROM ORDERS;
由于薪水大于2000,并且CUSTOMER_ID与CUSTOMERS表中的ID值匹配,最后一条记录(OID 103)的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 |