🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 8.3: DELETE 语句

在上一课中,我们学习了如何使用 UPDATE 修改记录。现在让我们看看如何使用 DELETE 语句 删除不必要或过时的行。这是一个重要的 DML 命令,应该特别小心使用,因为被删除的数据并不总是能够轻易恢复。

基本语法

DELETE FROM table_name
WHERE condition;
  • DELETE FROM table_name — 指定将从中删除行的表。
  • WHERE condition — 确定将删除哪些行。

如果省略 WHERE,表中的 所有行 都将被删除。


重要规则

  • 始终检查 WHERE 子句: 条件中的错误可能会删除错误的数据或过多的行。
  • 先运行 SELECT 在使用 DELETE 之前,最好先使用相同条件运行 SELECT,确保结果正确。
  • 表结构保持不变: DELETE 只删除数据,而不删除表本身或其列。
  • 相关数据很重要: 如果定义了外键,数据库可能会阻止删除被其他表引用的行。
  • 事务: 在生产系统中,重要的删除操作最好在事务中进行。

示例

示例 1:删除一行

让我们通过标识符删除一个客户:

DELETE FROM customer
WHERE customer_id = 1;

注意:由于 WHERE customer_id = 1,只有一行特定的记录将被删除。

示例 2:按条件删除多行

让我们删除在某个日期之前的付款记录:

DELETE FROM payment
WHERE payment_date < '2005-05-25';

结果:所有在指定日期之前的 payment 行将被删除。

示例 3:使用子查询删除

有时需要根据另一个表的条件删除行。例如,让我们删除由非活跃客户进行的付款:

DELETE FROM payment
WHERE customer_id IN (
    SELECT customer_id
    FROM customer
    WHERE active = 0
);

结果:所有标记为非活跃的客户的付款将被删除。

示例 4:从表中删除所有行

如果需要完全清空一个表,可以在不使用 WHERE 的情况下使用 DELETE

DELETE FROM temp_import;

注意:temp_import 表仍然存在,但其所有行将被删除。


删除前的检查

一个好的做法是先检查哪些行将受到影响:

-- 首先检查行
SELECT customer_id, first_name, last_name, active
FROM customer
WHERE active = 0;

-- 只有在验证后,运行 DELETE
DELETE FROM customer
WHERE active = 0;

这种方法有助于避免意外删除额外的数据。


DELETE 特别有用的情况

  • 清理临时或测试数据;
  • 按日期删除过时记录;
  • 删除不再符合业务规则的行;
  • 准备表以重新加载数据。

本课的关键要点:

  • DELETE 从表中删除现有行。
  • 如果没有 WHERE,表中的 所有 行将被删除。
  • 在删除之前,建议使用相同条件运行 SELECT
  • DELETE 保持表结构不变 — 仅删除数据。
  • 在重要场景中,使用事务和考虑外键更安全。

尝试解决以下任务,以巩固您在本课中学到的内容。

  1. 删除客户记录
  2. 删除企鹅记录
  3. 删除电影记录
  4. 删除员工记录