4.1 UPDATE SET语句
如果您需要更改表中的现有记录,那么为此我们使用运算符UPDATE
。
一方面,运算符UPDATE
类似于运算符INSERT
,因为我们需要为列指定新值。另一方面,在 operator 上SELECT
,因为它允许您立即处理数据组。
重要的!运算符的目的UPDATE
不是改变表中某一行的数据,而是改变满足一定条件的所有行的数据。而且如果你犯了一个小错误,你很容易丢失表中的所有数据。
请求的一般视图:
UPDATE table SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE condition;
让我们编写一个查询,将所有员工的薪水增加100。我们的查询将如下所示:
UPDATE employee SET
salary = salary+100;
而且现在对于每个工资低于50K的人,我们也会提高20%。请求示例:
UPDATE employee SET
salary = salary*1.2
WHERE salary<50000;
当然,我们会把主任的工资提高2倍,没有他怎么行:
UPDATE employee SET
salary = salary*2
WHERE id=4;
4.2 复杂的数据修改场景
如果您决定同时更改多个表中的数据,或者当您更改一个表中的数据时,您需要用另一个表中的数据填充它,或者只是在更改第一个表的过程中以某种方式使用另一个表中的数据,然后惊喜等待着我们。
让我们尝试更改 employee 表中存在的 user 表中所有用户的级别。为简单起见,我们将按名称检查用户的重合性。
我们想如何编写此查询:
UPDATE user SET
level = 80,
WHERE user . name IN ( list of names from employee table );
好吧,让我们将员工表中的姓名列表添加到此查询中:
UPDATE user SET
level = 80,
WHERE user.name IN (select name from employee);
有趣的!用于获取名称的 SQL 查询本身比任务描述还要短。SQL 的创造者没有白吃他们的面包。
被迫让你心烦意乱——这种方法行不通. 首先你需要加入这些表,它看起来像这样:
UPDATE table 1, table 2 SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE table 1.id = table 2.ref_id;
让我们让它更难一点。只有薪水超过 50k 的优秀员工才需要将级别设置为 80。完整的解决方案将如下所示:
UPDATE user, good_employees SET
user.level = 80
WHERE user.name = good_employees.name;
这样的表连接实际上是INNER JOIN
,所以最后只保留第二张表中按名称匹配的用户。
但是我们仍然需要以某种方式选择优秀的员工,所以让我们添加更多代码:
SELECT * FROM employee WHERE salary >= 50000
现在我们在最终查询中替换此表:
UPDATE user,
(SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
user.level = 80
WHERE user.name = good_emps.name;
现在忍受它。