UPDATE语句
UPDATE [IGNORE] 表名
SET 字段1=值1, 字段2=值2,...
[WHERE 条件1 ...]
[ORDER BY ...]
[LIMIT ...];
- 这里的
LIMIT
只能写一个参数
- 执行顺序:
UPDATE-> WHERE-> ORDER BY-> LIMIT-> SET
练习
- 把每个员工的编号和上司的编号+1,用ORDER BY子句完成
update t_emp set empno=empno+1,mgr=mgr+1
order by empno desc;
- 把月收入前三名的员工底薪减100元,用LIMIT子句完成
update t_emp set sal=sal-100
order by sal+ifnull(comm,0) desc limit 3;
- 把10部门中,工龄超过20年的员工,底薪增加200元
update t_emp set sal=sal+200
where deptno=20 and datediff(now(),hiredate)/365>20;
UPDATE语句的表连接
- 因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造UPDATE语句
UPDATE 表1JOIN 表2 ON 条件
SET 字段1=值1, 字段2=值2...;
- 表连接的UPDATE语句可以修改多张表的记录
- UPDATE语句的表连接可以演变成下面的样子
UPDATE 表1, 表2
SET 字段1=值1, 字段2=值2, WHERE 连接条件;
- 把ALLEN调往RESEARCH部门,职务调整为ANALYST,并修改RESEARCH部门的地点为北京
update t_emp e join t_dept d
set e.deptno=d.deptno,e.job="ANALYST",d.loc="北京"
where e.ename="ALLEN" and d.dname="RESEARCH";
练习
update t_emp e join (select avg(sal) avg from t_emp) s
on where e.sal<s.avg
set e.sal=e.sal+150;
UPDATE语句的左右连接
- UPDATE语句的表连接既可以是内连接,又可以是外连接
UPDATE 表1 [LEFT | RIGHT] JOIN 表2 ON 条件
SET 字段1=值1,字段2=值2,...;
- 把没有部门门的员工,或者SALES部门]低于2000元底薪的员工,都调往20部门
update t_emp e left join t_dept d on e.deptno=d.deptno
set e.deptno=20
where e.deptno is null or (d.dname="SALES" and e.sal<2000);