如何在单查询中用多WHERE子句更新多行及合并四查询为单查询
嘿,我来帮你搞定这两个SQL问题!
1. 一条SQL语句用多条件更新多行数据
其实你不用纠结多个WHERE子句,SQL里有更高效的方式一次性更新多行不同数据——用CASE WHEN条件分支,或者UPDATE ... JOIN关联更新,比写N条UPDATE语句简洁多了,还能减少数据库交互次数。
举个实际例子,假设你有个products表,要给不同ID的商品更新价格和库存:
UPDATE products SET price = CASE WHEN id = 1 THEN 29.99 -- ID=1的商品改价为29.99 WHEN id = 2 THEN 39.99 -- ID=2的商品改价为39.99 WHEN id = 3 THEN 19.99 -- ID=3的商品改价为19.99 ELSE price -- 其他商品保持原价格不变 END, stock = CASE WHEN id = 1 THEN 50 -- ID=1的库存设为50 WHEN id = 2 THEN 30 -- ID=2的库存设为30 WHEN id = 3 THEN 100 -- ID=3的库存设为100 ELSE stock -- 其他商品库存不变 END WHERE id IN (1, 2, 3); -- 只锁定需要更新的行,避免全表扫描浪费资源
如果你的更新数据来自另一个表(比如有个product_updates表存了最新的商品数据),还可以用JOIN方式批量更新:
UPDATE products p JOIN product_updates pu ON p.id = pu.product_id -- 通过商品ID关联两张表 SET p.price = pu.new_price, p.stock = pu.new_stock; -- 直接把新数据同步过去
2. 将四条SQL简化为单条执行
这个得看你四条SQL的具体用途,但常见的场景主要有两种,我给你分别举例子说明:
场景1:四条都是不同条件的统计查询(比如统计不同状态的订单数)
假设原来的四条SQL是这样的:
SELECT COUNT(*) AS pending FROM orders WHERE status = 'pending'; SELECT COUNT(*) AS shipped FROM orders WHERE status = 'shipped'; SELECT COUNT(*) AS cancelled FROM orders WHERE status = 'cancelled'; SELECT COUNT(*) AS completed FROM orders WHERE status = 'completed';
可以用条件聚合把它们合并成单条查询,一次搞定所有统计:
SELECT COUNT(CASE WHEN status = 'pending' THEN 1 END) AS pending, COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped, COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled, COUNT(CASE WHEN status = 'completed' THEN 1 END) AS completed FROM orders;
场景2:四条是结构相同的不同数据集查询(比如查不同分类的商品)
如果原来的四条SQL是这样的:
SELECT id, name, price FROM products WHERE category = 'electronics'; SELECT id, name, price FROM products WHERE category = 'clothing'; SELECT id, name, price FROM products WHERE category = 'home'; SELECT id, name, price FROM products WHERE category = 'beauty';
最简单的方式是用IN条件直接合并:
SELECT id, name, price FROM products WHERE category IN ('electronics', 'clothing', 'home', 'beauty');
如果你的四条查询是完全独立的结果集(结构相同),还可以用UNION ALL合并(注意UNION会去重,UNION ALL更快,适合不需要去重的场景):
SELECT id, name, price FROM products WHERE category = 'electronics' UNION ALL SELECT id, name, price FROM products WHERE category = 'clothing' UNION ALL SELECT id, name, price FROM products WHERE category = 'home' UNION ALL SELECT id, name, price FROM products WHERE category = 'beauty';
如果你的四条SQL是关联不同表的复杂查询,核心思路是找到它们的关联逻辑,用JOIN或者子查询把它们整合到一起,减少重复查询数据库的次数。
内容的提问来源于stack exchange,提问作者Toleo
相关产品推荐
相关产品推荐

