在SQL中,使用带有 JOIN 的 UPDATE 语句,可以根据另一张表中的值来修改一张表中的数据。
示例
UPDATE Customers C
JOIN Orders O ON C.customer_id = O.customer_id
SET C.last_name = 'Smith'
WHERE O.item = 'Keyboard';
在这里,SQL命令连接了 Customers 和 Orders 这两张表。然后,它将所有订购了键盘的客户在 Customers 表中的 last_name 列更新为 Smith
。
UPDATE With INNER JOIN
在 `UPDATE` 语句中使用 INNER JOIN,当两张表中找到匹配记录时,可以进行精确的修改。
让我们看一个例子。
UPDATE Customers C
JOIN Shippings S ON C.customer_id = S.customer
SET C.age = C.age + 1
WHERE S.status = 'Pending';
这条SQL命令将 Customers 表中,在 Shippings 表中收货状态为 Pending
的顾客的年龄增加 1。
注意:我们的在线编译器基于SQLite,它不支持在 `UPDATE` 和 `JOIN` 语句中同时使用。
UPDATE With LEFT JOIN
在 `UPDATE` 语句中使用 LEFT JOIN,即使在连接表中没有匹配的记录,也可以进行更新。例如:
UPDATE Customers C
LEFT JOIN Orders O ON C.customer_id = O.customer_id
SET C.country = 'Unknown'
WHERE O.customer_id IS NULL;
这条命令将 Customers 表中,在 Orders 表中没有匹配记录的顾客的 country 列更新为 Unknown
。
UPDATE With Multiple JOINs
对于复杂场景,我们也可以在一个 `UPDATE` 语句中使用多个 `JOIN` 查询。例如:
UPDATE Customers C
JOIN Orders O ON C.customer_id = O.customer_id
JOIN Shippings S ON O.order_id = S.shipping_id
SET C.first_name = 'Alice'
WHERE S.status = 'Delivered' AND O.item = 'Monitor';
在这里,SQL查询将 Customers 表中,订购了 Monitor
且收货状态为 Delivered
的顾客的 first_name 更新为 Alice
。
UPDATE With Subquery
在 `WHERE` 子句中使用子查询可以模拟SQLite中的 JOIN 行为。例如:
UPDATE Customers
SET age = age + 1
WHERE customer_id IN (
SELECT customer
FROM Shippings
WHERE status = 'Pending'
);
SELECT * FROM Customers;
这条命令将 Customers 表中,在 Shippings 表中收货状态为 Pending
的顾客的年龄增加。