注:(1)内连接可以不使用ON或者WHERE;外连接必须使用ON子句,否则会报错!!!

(2)UPDATE确定数据源头(或者说,UPDATE子句确定“待操作数据集”),WHERE子句:对“待操作数据集”做二次筛选。

       (3)案例4:这个例子说明,UPDATE语句可以同时修改多张表。。。

       (4)子查询不能在UPDATE语句中使用的原因:首先,在UPDATE中使用子查询,这会是相关子查询,效率很低;然后,MySQL不允许对要更改或要删除记录的数据表做子查询(很显然,动脑子想一想也明白了);

目录

一:UPDATE语句简介

二:案例:不涉及表连接  的案例(这部分不难)

三:案例:涉及表连接


一:UPDATE语句简介

● UPDATE子句,选择要修改的表;UPDATE子句只执行一次;

● IGNORE关键字可写可不写,作用是在写入数据的时候,如果遇到冲突就直接忽略。

● WHERE子句:筛选要修改的记录;

● ORDER BY子句的应用场合:把筛选出的记录进行排序。比如,当修改记录的主键的时候,给主键值都加1的时候,就需要把数据降序排列,这样才不会在修改主键的时候发生唯一性冲突;(自然如果给主键值都减1,就需要把数据升序排列了);

LIMIT子句:这儿的LIMIT子句只能写一个参数;

下面的执行顺序:UPDATE子句→WHERE子句→ORDER BY子句→LIMIT子句→SET子句;


二:案例:不涉及表连接  的案例(这部分不难)

案例1:把每个员工的编号和上司的编号+1,用ORDER BY子句完成;

这个例子很简单,不涉及多表查询;

UPDATE t_emp SET empno=empno+1,mgr=mgr+1
ORDER BY empno DESC;

……………………………………………………

案例2:把月收入排在前三名的员工,底薪减100元,用LIMIT子句完成

注意,LIMIT子句的用法。

这个例子很简单,不涉及多表查询;

UPDATE t_emp SET sal=sal-100
ORDER BY sal+IFNULL(comm,0) DESC
LIMIT 3;

……………………………………………………

案例3:把10部门中,工龄超过20年的员工,底薪增加200元,WHERE子句

这个例子很简单,不涉及多表查询;

UPDATE t_emp SET sal=sal+200
WHERE deptno=10 AND FLOOR(DATEDIFF(NOW(),hiredate)/365)>=20;


三:案例:涉及表连接

案例4:把ALLEN调往RESEARCH部门,职务调整为ANALYST;

这个案例中,涉及到了多张表,RESEARCH部门的编号不知道;

最直接的思路:使用子查询。

UPDATE t_emp e SET job="ANALYST",deptno=(SELECT d.deptno FROM t_dept d WHERE d.dname="RESEARCH")
WHERE e.ename="ALLEN";

但是上面的做法中,子查询是相关子查询,如果需要修改的不止ALLEN一人,那么【SELECT d.deptno FROM t_dept d WHERE d.dname="RESEARCH"】将会执行很多次。。。

涉及多张表的时候,需要引入表连接:

下面的两种表连接都是内连接的语法:内连接的,其中包括使用ON子句,和使用ON子句。

利用表连接的方式实现:这种骚操作。。。(这儿非常重要!!!!!,是核心!!!)

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";

分析:执行过程是,现将俩表做笛卡尔积(因为没有使用ON子句啦)从t_emp表中筛选出e.name="ALLEN"这条记录,从t_dept表中筛选出d.dname="RESEARCH"这条记录,其实,这所谓的两条记录在【笛卡尔积】中是在一条记录上的;此时,已经分别在两个表中各获得了一条记录,然后分别在获取的这两条记录上执行执行【SET e.deptno=d.deptno,e.job="ANALYST",d.loc="成都"】。然后,对此条记录的操作就能影响到原表上。

这个表连接的例子其实并不难,很简单,多想一下表连接的那个结果集,,,,,

同时,这个例子说明,UPDATE语句可以同时修改多张表。。。

……………………………………………………

案例5:把底薪低于公司平均底薪的员工,底薪增加150元;

【公司的平均底薪】和【谁的底薪低于公司的平均底薪】不知道;

我的解决方案:还是这种很骚的操作,,,

UPDATE t_emp e1 JOIN (SELECT AVG(sal) aa FROM t_emp) e2
SET e1.sal=e1.sal+150
WHERE e1.sal<e2.aa;

注:这个例子和【案例4】结合后,可以发现,这种表连接的骚操作,可以应用于多条记录的情况。

即,重复下【案例4】中的话,这些在笛卡尔积上挑选出的记录,对这些记录的更改可以影响到原表上。

通过这个例子,更加说明,UPDATE子句是指执行一次的。

标准做法:和我的做法类似,只是这儿将条件放在了ON子句中,我的做法是将条件放在了WHERE子句中。

UPDATE t_emp e1 JOIN (SELECT AVG(sal) aa FROM t_emp) e2 ON e1.sal<e2.aa
SET e1.sal=e1.sal+150;

……………………………………………………

UPDATE语句的表连接的第三种方式:外连接的语法,外连接的时候,条件只能写在ON子句中,,,而且ON子句不能少!!!!!

案例6:把没有部门的员工,或者SALES部门低于2000底薪的员工,都调往20部门。

涉及到多张表,需要表连接;张三没有部门,连接时需要保留,所以需要外连接;

第一种错误方案:

UPDATE t_emp e LEFT JOIN (SELECT deptno FROM t_dept WHERE dname="SALES") dd
ON e.deptno=NULL OR (e.sal<=2000 AND e.deptno=dd.deptno)
SET e.deptno=20;

可以发现,实际效果出错了如BLACK的部门也没改成20了。首先,判断字段是不是空,需要IS NULL 而不是=NULL;

动动脑子:在左连接的时候,左边的记录都会被保留下来!!!!!!!!!!所以,这儿的结果是错误的,deptno全变成20了。。。

第二种错误方案:错误原因,经过多次测试,发现左连接和右连接必须要有ON子句,否则会报错。这个需要后续确定,并在外连接的那篇博客中标记一下。

UPDATE t_emp e LEFT JOIN (SELECT deptno FROM t_dept WHERE dname="SALES") dd
SET e.deptno=20
WHERE e.deptno IS NULL OR (e.sal<=2000 AND e.deptno=dd.deptno);

标准做法:这个例子很典型,调理清晰,好好想想,,,

这儿,UPDATE确定数据源头(或者说,UPDATE子句确定“待操作数据集”),WHERE子句:对“待操作数据集”做二次筛选。

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);

MySQL对数据的基本操作三:UPDATE语句相关推荐

  1. mysql update修改数据_MYsql如何用update语句修改数据,值得一看

    update语句用于修改数据,如果用户的某一条数据或是某一条数据种的某个字段需要被修改,那么update语句将发挥巨大的作用. 工具/材料 MYSQL 终端 操作方法 01 首先,您需要完成您服务器环 ...

  2. mysql基础架构(一条update语句如何执行)

    update语句如何执行? 一.流程分析 二.重要的日志模块 1.redo log 2.binlog 3.两阶段提交 三.小结 一.流程分析 与查询流程不一样的是,更新流程涉及,两个重要的日志模块,r ...

  3. 第四章 数据库和SQL 4-3 数据的更新(UPDATE语句的使用方法)

    一.UPDATE语句的基本语法. 二.指定条件的UPDATE语句(搜索型UPDATE) 三.使用NULL进行更新 NULL清空:使用UPDATE可以将列更新为NULL,俗称NULL清空. 四.多列更新 ...

  4. 数据操作语言:UPDATE语句

    UPDATE语句 UPDATE语句用于修改表的记录 UPDATE [IGNORE] 表名 SET 字段1=值1, 字段2=值2,... [WHERE 条件1 ...] [ORDER BY ...] [ ...

  5. MySQL高性能数据_第三版(读书笔记)

    1. 如何保证在系统崩溃时,事务处理的数据一致性?(事务日志) 概念:事务日志可以帮助提升事务的效率. 使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事 ...

  6. MYSQL学习笔记之简单的UPDATE语句(二)

    声明:本文章内容是根据极客时间中林晓斌的课程<MYSQL45讲>,经过学习,加以自己的理解形成的笔记.具体原文可以到官网进行阅读.如有侵权请,告知删除. UPDATE t SET name ...

  7. MySQL数据库——数据查询(三)

    目录 一.单表查询 1.选择字段 1.1.查询指定字段 1.2.查询所有字段 1.3.查询经过计算的值 1.4.定义字段的别名 2.选择指定记录 2.1.比较大小 2.2.带BETWEEN...AND ...

  8. MySQL修改数据表(ALTER TABLE语句)

    为实现数据库中表规范化设计的目的,有时候需要对之前已经创建的表进行结构修改或者调整. 在 MySQL 中可以使用 ALTER TABLE 语句来改变原有表的结构,例如增加或删减列.创建或取消索引.更改 ...

  9. MySQL删除数据表(DORP TABLE语句)

    在 MySQL 数据库中,对于不再需要的数据表,我们可以将其从数据库中删除.下面我们来了解一下 MySQL 数据库中数据表的删除方法. 基本语法 当需要删除一个表的时候,可以使用 DROP TABLE ...

  10. MySQL创建数据表(CREATE TABLE语句)

    在创建数据库之后,接下来就要在数据库中创建数据表.所谓创建数据表,指的是在已经创建的数据库中建立新表. 创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性.引用完整性和域 ...

最新文章

  1. HTML代码编写规范
  2. mxnet 常用层,卷积激活损失
  3. 计算机基础知识在线作业,福建师范大学《计算机应用基础》在线作业一答案.docx...
  4. [20181015]为什么是3秒.txt
  5. pythom打包文件太大_从SQL注入到整站打包与本地搭建
  6. (65)SPI外设驱动用户接收模块(四)(第13天)
  7. Head First 设计模式 —— 单例模式(Singleton)
  8. mybatis中的动态Sql略解,基础理解,为什么要使用动态sql,动态sql相比于传统sql的区别;仅作笔记,如有错误请及时指出
  9. 软件工程小组第八次会议记录
  10. 【归纳备忘】收集了一些神奇的BT种子磁力链接搜索网址
  11. Windows XP 按权限设置共享
  12. 论文主题、引用量、中国机构 华人学者,KDD 2020 关键数据抢先看
  13. html实现背景图片自动更换,如何实现在HTML中更换或添加网站背景图片
  14. 添加用户并赋予 root管理员权限
  15. 头的各个部位示意图_牛肉的部位图解与做法+牛肉各个部位分布图及质地简介...
  16. 快递取件码生成软件_一种快递柜取件码生成装置及其使用方法与流程
  17. 通过车牌识别实现进出厂无人值守
  18. prent()和prents()的区别
  19. android 文件管理器下载,ES文件管理器下载
  20. 2021-10-28 MyBatis学习

热门文章

  1. 判断PPC或者SP平台
  2. 骨传导耳机推荐,2021骨传导耳机排行榜
  3. weka,FP,priori
  4. 解决only integer scalar arrays can be converted to a scalar index
  5. Mstar 平台背光时序调试
  6. 北京内推 | Hulu机器学习应用平台团队招聘推荐大数据方向暑期实习生
  7. Noip 2016 蛋碎一地晚节不保
  8. 425 Failed to establish connection解决方案
  9. Angular学习笔记第三章——创建组件
  10. 安全架构--8--我设计的企业安全体系架构