5.2 数据库:UPDATE子句

发布于:2025-02-10 ⋅ 阅读:(70) ⋅ 点赞:(0)

1. UPDATE语句

update语句也是属于DML数据操作语言之中的一个语句。update语句是用来修改记录的

UPDATE:它的语法我们一起来看一下,开头是update,然后后面跟上一个ignore关键字,ignore这个关键字,写在中括号里面了,代表说是可写可不写都行

IGNORE:在写入数据的时候,IGNORE 关键字会把那些组件冲突维持冲突的记录给忽略掉。把那些不冲突的记录写到数据表里面。但是现在在update语句里边放上 IGNORE 这个关键字,就是修改数据的时候,遇到冲突的情况下,那就直接忽略把那些不冲突的记录修改到数据表里面,后面是想修改哪张数据表,你把表名字就写上来就行了

SET : SET子句里边可以规定,比如说某一个字段等于什么值,另外的字段等于什么值,可以去规定改多少个字段都无所谓。这些字段之间用逗号分开就行了

WHERE:再往下还有几个是可写可不写的子句,比如说where子句,也是用中括号给括起来了,写不写都行。不写where子句的时候,代表的就是全表范围的记录的去修改。如果说你写上where子句,就是有筛选条件,符合这些条件的记录

ORDER BY子句:order by子句是对数据排序的意思,我们为什么要对数据进行排序呢?比如说我在修改记录的时候,我想把每一个人的员工编号都加1。正常情况下,比如说这个员工编号都是有次序的。这个排下来。比如说有一个人的这个员工编号是7000,那么我把这个员工编号加一的时候,他变成7001,但是遇到一个问题,因为下面的记录有7001这个员工的这个记录,对吧?所以就会引发逐渐的冲突。但是我们用order by词句。如果说按照这个员工的编号排成降序的话,那么排在最前面的就是员工的这个编号最大的那个值。把他的这个员工编号加一的话,那就没有比他再大的这样的员工的编号,所以加一是没有问题的,不会引发组件冲突。这个order by子句还是有它的使用的场合的,是对记录先排序,再去修改。

LIMIT: limit子句是用来取分页数据的。比如说我想把这张表里边的前三条记录给修改一下,Limit然后写上3 就行了。

执行顺序:UPDATE-->WEHRE-->ORDER BY --> SET

练习1:把每个员工编号和上司编号+1,用ORDER BY 子句完成 

update t_emp set empno=empno+1,mgr=mgr+1
order by empno desc

练习2:把月收入排名前3的员工底薪减100,用LIMIT完成

update t_emp
set sal=sal-100
order by sal+ifnull(comm,0) desc
limit 3

练习3:把10部门中,工龄超过20年的员工,底薪增加200元 

update t_emp
set sal=sal+200
where DATEDIFF(now(),hiredate)/365>20

2. UPDATE语句的表连接

因为相关子查询的效率非常低,所以我们要用表连接的方式去改造update语句。具体的语法也非常的简单。就是update。然后表1,然后join表2,后面写上on的条件就行了

 用到了这个update语句的表连接的写法。就可以引申出来下面的一个写法。因为这个join on, 我们现在用的是一个内连接的一个写法,所以内连接可以衍生出语法,把这个on字句变成where子句,把join关键字变成逗号,所以就引申出来另外一种update的语法了,就是update语句里边写上要连接的表1,逗号表2,然后这个连接的条件写到where子句里面就行了

练习4:把ALLEN调往RESEARCH部门,职务调整为ANALYST

update t_emp e join t_dept d
set e.deptno=d.deptno,e.job="ANALYST"
where e.ename="ALLEN" and d.dname="RESEARCH"

练习5:把底薪低于公司平均底薪的员工,底薪增加150元

update 
t_emp e join
(select avg(sal) as avg from t_emp) t
on e.sal<t.avg
set sal=sal+150

 

练习6:把没有部门的员工,或者SALES部门低于2000元底薪的员工,都调往20部门


网站公告

今日签到

点亮在社区的每一天
去签到