概述
- 以下是 MySQL 中
UPDATE
结合SELECT
和UPDATE CASE WHEN
的示例:
一、UPDATE
结合 SELECT
(跨表更新)
场景:根据 orders
表中的订单总金额,更新 users
表中用户的 total_spent
字段。
-- 创建测试表
CREATE TABLE users (user_id INT PRIMARY KEY,username VARCHAR(50),total_spent DECIMAL(10,2)
);CREATE TABLE orders (order_id INT PRIMARY KEY,user_id INT,amount DECIMAL(10,2)
);-- 插入测试数据
INSERT INTO users VALUES (1, 'Alice', 0), (2, 'Bob', 0);
INSERT INTO orders VALUES (100, 1, 50), (101, 1, 30), (102, 2, 80);-- 更新 users.total_spent,统计每个用户的订单总金额
UPDATE users u
JOIN (SELECT user_id, SUM(amount) AS totalFROM ordersGROUP BY user_id
) o ON u.user_id = o.user_id
SET u.total_spent = o.total;-- 结果:Alice 的 total_spent 变为 80,Bob 的变为 80
二、UPDATE CASE WHEN
(条件更新)
场景:根据 salary
字段的值,调整 employees
表中的工资:
• 工资 < 5000 的涨 10%
• 5000 ≤ 工资 ≤ 10000 的涨 5%
• 工资 > 10000 的不变
-- 创建测试表
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50),salary DECIMAL(10,2)
);-- 插入测试数据
INSERT INTO employees VALUES (1, 'John', 4000), (2, 'Jane', 6000), (3, 'Mike', 12000);-- 使用 CASE WHEN 更新工资
UPDATE employees
SET salary = CASEWHEN salary < 5000 THEN salary * 1.10WHEN salary BETWEEN 5000 AND 10000 THEN salary * 1.05ELSE salary
END;-- 结果:
-- John: 4000 → 4400
-- Jane: 6000 → 6300
-- Mike: 12000 → 不变
三、UPDATE
结合子查询(单表条件更新)
场景:将 products
表中库存量(stock
)低于 100 的商品的 status
标记为 ‘缺货’。
-- 创建测试表
CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(50),stock INT,status VARCHAR(20)
);-- 插入测试数据
INSERT INTO products VALUES (1, 'Pen', 200, '正常'), (2, 'Book', 50, '正常'), (3, 'Ruler', 99, '正常');-- 使用子查询和 CASE WHEN 更新状态
UPDATE products
SET status = CASEWHEN stock < 100 THEN '缺货'ELSE '正常'
END;-- 结果:
-- Pen: stock=200 → 状态保持 '正常'
-- Book: stock=50 → 状态变为 '缺货'
-- Ruler: stock=99 → 状态变为 '缺货'