这个问题很简单,来自Joe Celko的《SQL编程风格》,略作修改:要对一批书更新价钱,不低于30¥的降价10%,低于30¥的降价5%。
我们先建表:
CREATE TABLE `books` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`price` float NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入以下数据:
+----+-------+
| id | price |
+----+-------+
| 1 | 30 |
| 2 | 10 |
+----+-------+
##方法1:使用游标 使用游标,需要使用循环。一般不推荐使用游标。
##使用两个UPDATE
UPDATE books
SET price = price * 0.90
WHERE price>=30;
UPDATE books
SET price = price * 0.95
WHERE price<30;
执行后,数据如下:
+----+-------+
| id | price |
+----+-------+
| 1 | 25.65 |
| 2 | 9.5 |
+----+-------+
30¥在更新之后应为27¥,但是第二个update又把27¥更新了一次,所以结果并不是我们想要的。
##使用1个UPDATE + CASE
UPDATE books
SET price = CASE WHEN price >= 30
THEN price * 0.90
ELSE price * 0.95 END;
执行后,数据如下:
+----+-------+
| id | price |
+----+-------+
| 1 | 27 |
| 2 | 9.5 |
+----+-------+
结果符合要求。