SQL DELETE 语句
- SQL DELETE 语句
- 在 SQL 中删除特定行
- 在 SQL 中删除多行
- 从表中删除所有行
- 回滚 DELETE 操作
- DELETE 与 TRUNCATE
- 关于 DELETE 语句的重要要点
SQL DELETE 语句
SQL 中的 DELETE 语句用于从表中删除一条或多条现有记录。
- 可以使用 WHERE 子句删除特定行。
- 通过省略 WHERE 子句,可以删除表中的所有行,而不删除表本身。
- DELETE 操作是永久性的,除非使用 transaction,否则无法撤销。
语法
DELETE 语句的基本语法如下:
DELETE FROM table_name WHERE condition;
在 SQL 中删除特定行
可以通过使用 WHERE 子句指定条件来使用 DELETE 语句删除单行。
示例
假设我们创建了一个名为 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 |
现在,删除 ID = 2 的客户记录:
DELETE FROM CUSTOMERS WHERE ID = 2;
输出结果如下所示:
Query OK, 1 row affected (0.01 sec)
验证
要验证 ID = 2 的行是否已被删除,请使用以下 select 查询:
SELECT * FROM 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 |
在 SQL 中删除多行
可以通过使用 DELETE 语句结合匹配多条记录的 WHERE 子句来删除多行。
当您想要删除满足特定条件的所有记录时,这非常有用,例如来自某个城市的用户,或年龄低于某个值的客户。
示例
以下查询删除薪资低于 3000 的所有客户:
DELETE FROM CUSTOMERS WHERE SALARY < 3000;
获得以下输出:
Query OK, 3 rows affected (0.02 sec)
验证
要验证删除操作,请使用以下 select 查询:
SELECT * FROM CUSTOMERS;
生成以下表:
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | Hyderabad | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
删除表中的所有行
如果您想从表中移除所有行,可以使用不带WHERE 子句的DELETE 语句。
此操作会清除表中的所有数据,但保留表结构(列、数据类型、索引等)不变,因此您可以稍后插入新数据,而无需重新创建表。
使用此方法时要谨慎,尤其是在生产环境中,因为它无法撤销,除非您有备份或使用可回滚的事务。
语法
以下是在 SQL 中删除表中所有行的基本语法:
DELETE FROM table_name;
示例
以下命令从CUSTOMERS 表中删除所有记录:
DELETE FROM CUSTOMERS;
以上代码的输出如下:
Query OK, 7 rows affected (0.02 sec)
验证
要验证 customers 表中所有记录是否已被删除,请使用以下 select 查询:
SELECT * FROM CUSTOMERS;
您将得到以下输出:
Empty set (0.00 sec)
回滚 DELETE 操作
在 SQL 中,如果您在事务中工作,可以回滚 DELETE 操作,在其永久保存到数据库之前撤销它。
要使用回滚,您的数据库必须支持事务(例如 PostgreSQL、SQL Server、Oracle 等),并且您必须在发出DELETE 语句之前显式启动事务。
语法
以下是回滚删除操作的基本语法:
BEGIN TRANSACTION; DELETE FROM table_name WHERE condition; -- 如果需要,撤销删除 ROLLBACK; -- 或者,使更改永久生效 COMMIT;
示例
在此示例中,由于ROLLBACK 命令,ID = 3 的客户删除被撤销。该行仍保留在表中:
BEGIN TRANSACTION; DELETE FROM CUSTOMERS WHERE ID = 3; -- 哎呀!这是个错误 ROLLBACK;
我们得到的输出如下所示:
Query OK, 0 rows affected (0.00 sec)
如果您使用COMMIT 而非ROLLBACK,则删除将永久生效。
验证
要验证表中的记录未被删除,请使用以下 select 查询:
SELECT * FROM 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 |
| 6 | Komal | 22 | Hyderabad | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
DELETE 与 TRUNCATE 的比较
虽然DELETE 和TRUNCATE 都会从表中移除数据,但它们之间存在一些主要区别:
| 特性 | DELETE | TRUNCATE |
|---|---|---|
| 行选择 | 可以使用WHERE 子句删除特定行 | 移除所有行;不支持WHERE |
| 事务支持 | 与BEGIN TRANSACTION 一起使用时可以回滚 | 在大多数数据库中无法回滚 |
| 性能 | 由于逐行删除和日志记录,速度较慢 | 更快,因为它释放整个数据页 |
| 触发器 | 激活ON DELETE 触发器 | 不激活ON DELETE 触发器 |
| 自增重置 | 不重置 identity(自增)计数器 | 在某些数据库中重置 identity 计数器 |
关于 DELETE 语句的重要要点
在 SQL 中使用 DELETE 语句时,请记住以下一些重要要点:
- 始终使用WHERE 子句以防止意外数据丢失。
- 使用DELETE 进行选择性删除,使用TRUNCATE 进行完整数据清除。
- DELETE 语句可以与子查询结合使用,根据相关数据移除行。
- 在某些数据库中,可以使用JOIN 从多个相关表中删除数据。