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

课程 8.2: UPDATE 语句

在上一课中,我们学习了如何使用 INSERT INTO 添加新行。现在让我们看看如何使用 UPDATE 语句修改已经存在的数据。这是保持数据库最新和准确的关键 DML 操作之一。

基本语法

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • UPDATE table_name — 指定要更改数据的表。
  • SET column = value — 为一个或多个列分配新值。
  • WHERE condition — 确定哪些行将被更新。

重要规则

  • 始终使用 WHERE 如果没有 WHERE 子句,UPDATE 语句将修改表中的每一行。这是最常见和危险的错误之一。
  • 数据类型: 新值必须与列的数据类型匹配。
  • 字符串和日期: 文本值和日期必须用单引号(')括起来。
  • 数字: 数值不需要引号。
  • 事务: 在生产系统中,建议在事务中运行 UPDATE,以便在发生错误时可以回滚更改。

示例

示例 1:更新单个列

让我们更改 customer 表中特定客户的电子邮件地址。

UPDATE customer
SET email = 'new.email@example.com'
WHERE customer_id = 1;

注意:WHERE customer_id = 1 条件确保只有一条特定记录被更改。

示例 2:一次更新多个列

您可以在 SET 子句中列出多个列,用逗号分隔。

UPDATE customer
SET first_name = 'ALICE',
    last_name  = 'COOPER',
    email      = 'alice.cooper@example.com'
WHERE customer_id = 42;

示例 3:在表达式中使用当前值

UPDATE 语句允许您根据当前值计算新值。例如,让我们将所有喜剧电影的租金提高 10%:

UPDATE film
SET rental_rate = rental_rate * 1.10
WHERE film_id IN (
    SELECT f.film_id
    FROM film f
    JOIN film_category fc ON f.film_id = fc.film_id
    JOIN category c       ON fc.category_id = c.category_id
    WHERE c.name = 'Comedy'
);

结果:所有喜剧电影的租金将增加 10%。

示例 4:根据条件更新多行

让我们标记所有在某个日期后没有租借任何东西的非活跃客户:

UPDATE customer
SET active = 0
WHERE customer_id NOT IN (
    SELECT DISTINCT customer_id
    FROM rental
    WHERE rental_date >= '2005-08-01'
);

示例 5:将值设置为 NULL

如果列允许 NULL,您可以显式清除它:

UPDATE film
SET original_language_id = NULL
WHERE film_id = 10;

更新前验证

一个好的做法是先运行一个带有相同 WHERE 条件的 SELECT,以确认将受到影响的行:

-- 首先,检查 SELECT 返回的内容
SELECT customer_id, first_name, last_name, email
FROM customer
WHERE customer_id = 1;

-- 只有在验证后,运行 UPDATE
UPDATE customer
SET email = 'new.email@example.com'
WHERE customer_id = 1;

本课的关键要点:

  • UPDATE 语句修改表中现有的行。
  • 如果没有 WHERE 子句,所有行将被更新 — 始终仔细检查它是否存在。
  • 可以在单个 SET 子句中更新多个列,用逗号分隔。
  • 新列值可以根据其当前值计算(例如,price = price * 1.1)。
  • 在运行 UPDATE 之前,建议运行一个带有相同条件的 SELECT 来验证受影响的行。

在下一课中,我们将探讨 DELETE 语句 — 如何安全且有控制地从表中删除行。

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

  1. 修正客户地址