热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:Mysql联表update数据的示例详解分享

1.MySQLUPDATEJOIN语法在MySQL中,可以在UPDATE语句中使用JOIN子句执行跨表更新。MySQLUPDATEJOIN的语法如下:UPDATET1,T2,[IN

1.MySQLUPDATEJOIN语法

在MySQL中,可以在UPDATE语句中使用JOIN子句执行跨表更新。MySQLUPDATEJOIN的语法如下:

UPDATET1,T2, [INNERJOIN|LEFTJOIN]T1ONT1.C1=T2.C1 SETT1.C2=T2.C2, T2.C3=expr WHEREcondition

更详细地看看MySQLUPDATEJOIN语法:

首先,在UPDATE子句之后,指定主表(T1)和希望主表连接表(T2)。

第二,指定一种要使用的连接,即INNERJOINLEFTJOIN和连接条件。JOIN子句必须出现在UPDATE子句之后。

第三,要为要更新的T1和/或T2表中的列分配新值。

第四,WHERE子句中的条件用于指定要更新的行。

2.示例

首先,我们将在这些例子中使用一个新的示例数据库(empdb)。示例数据库包含2个表:

employees表将存储在员工编号,姓名,工作表现和工资的数据。 merits表存储员工绩效和绩效百分比。

以下语句在empdb示例数据库中创建表并导入数据:

CREATEDATABASEIFNOTEXISTSempdb; USEempdb; --createtables CREATETABLEmerits( performanceINT(11)NOTNULL, percentageFLOATNOTNULL, PRIMARYKEY(performance) ); CREATETABLEemployees( emp_idINT(11)NOTNULLAUTO_INCREMENT, emp_nameVARCHAR(255)NOTNULL, performanceINT(11)DEFAULTNULL, salaryFLOATDEFAULTNULL, PRIMARYKEY(emp_id), CONSTRAINTfk_performanceFOREIGNKEY(performance) REFERENCESmerits(performance) ); --insertdataformeritstable INSERTINTOmerits(performance,percentage) VALUES(1,0), (2,0.01), (3,0.03), (4,0.05), (5,0.08); --insertdataforemployeestable INSERTINTOemployees(emp_name,performance,salary) VALUES('MaryDoe',1,50000), ('CindyMinsu',3,65000), ('SueGreenspan',4,75000), ('GraceDell',5,125000), ('NancyJohnson',3,85000), ('JohnDoe',2,45000), ('LilyBush',3,55000);

2.1使用INNERJOIN子句的MySQLUPDATEJOIN示例

假设想根据员工的工作表现来调整员工的工资。
因此,优点百分比存储在merits表中,必须使用UPDATEINNERJOIN语句根据存储在merits表中的百分比来调整employees表中员工的工资。
employeesmerits表之间以是performance字段相关联的。请参阅以下查询:

上面查询语句的工作原理是什么?
我们仅在UPDATE子句之后指定employees表,因为我们只想更新employees表中的数据。
对于employees表中的每一行,查询根据merits表中performance列中的值来检查employees表中的performance列中的值。如果找到一个匹配,它将获得merits表中的百分比,并更新employees表中的salary列。

mysql>select*fromemployees;--更新之前的数据 +--------+---------------+-------------+--------+ |emp_id|emp_name|performance|salary| +--------+---------------+-------------+--------+ |1|MaryDoe|1|50000| |2|CindyMinsu|3|65000| |3|SueGreenspan|4|75000| |4|GraceDell|5|125000| |5|NancyJohnson|3|85000| |6|JohnDoe|2|45000| |7|LilyBush|3|55000| +--------+---------------+-------------+--------+ 7rowsinset mysql>UPDATEemployees INNERJOIN meritsONemployees.performance=merits.performance SET salary=salary+salary*percentage;--执行连接更新 QueryOK,6rowsaffected Rowsmatched:7Changed:6Warnings:0 mysql>select*fromemployees;--更新之后的数据 +--------+---------------+-------------+--------+ |emp_id|emp_name|performance|salary| +--------+---------------+-------------+--------+ |1|MaryDoe|1|50000| |2|CindyMinsu|3|66950| |3|SueGreenspan|4|78750| |4|GraceDell|5|135000| |5|NancyJohnson|3|87550| |6|JohnDoe|2|45450| |7|LilyBush|3|56650| +--------+---------------+-------------+--------+ 7rowsinset

因为省略了UPDATE语句中的WHERE子句,所以employees表中的所有记录都被更新。如果需要performance等级大于1的员工才更新薪资,那么sql可以这样写:

UPDATEemployees INNERJOIN meritsONemployees.performance=merits.performance SET salary=salary+salary*percentage WHEREemployees.performance>1;

2.2使用LEFTJOIN的MySQLUPDATEJOIN示例

假设公司又雇用了两名新员工:

INSERTINTOemployees(emp_name,performance,salary) VALUES('JackWilliam',NULL,43000), ('RickyBond',NULL,52000);

因为这些员工是新员工,所以他们的绩效(performance)数据不可用或为NULL。现在
employees表中的数据,如下所示:

mysql>SELECT*FROMemployees; +--------+---------------+-------------+--------+ |emp_id|emp_name|performance|salary| +--------+---------------+-------------+--------+ |1|MaryDoe|1|50000| |2|CindyMinsu|3|66950| |3|SueGreenspan|4|78750| |4|GraceDell|5|135000| |5|NancyJohnson|3|87550| |6|JohnDoe|2|45450| |7|LilyBush|3|56650| |8|JackWilliam|NULL|43000| |9|RickyBond|NULL|52000| +--------+---------------+-------------+--------+ 9rowsinset

要计算新员工的工资,不能使用UPDATEINNERJOIN语句(为什么不能,可参考sql之leftjoin、rightjoin、innerjoin的区别),因为它们的绩效数据在merits表中不可用。这就是为什么要使用UPDATELEFTJOIN来实现了。
UPDATELEFTJOIN语句在另一个表中没有相应行时,就会更新表中的一行。
例如,可以使用以下语句将新雇员的工资增加1.5%:

UPDATEemployees LEFTJOIN meritsONemployees.performance=merits.performance SET salary=salary+salary*0.015 WHERE merits.percentageISNULL;

执行结果如下:

mysql>UPDATEemployees LEFTJOIN meritsONemployees.performance=merits.performance SET salary=salary+salary*0.015 WHERE merits.percentageISNULL; QueryOK,2rowsaffected Rowsmatched:2Changed:2Warnings:0 mysql>select*fromemployees; +--------+---------------+-------------+--------+ |emp_id|emp_name|performance|salary| +--------+---------------+-------------+--------+ |1|MaryDoe|1|50000| |2|CindyMinsu|3|66950| |3|SueGreenspan|4|78750| |4|GraceDell|5|135000| |5|NancyJohnson|3|87550| |6|JohnDoe|2|45450| |7|LilyBush|3|56650| |8|JackWilliam|NULL|43645| |9|RickyBond|NULL|52780| +--------+---------------+-------------+--------+ 9rowsinset

示例

#单表join updatebbs_uhome_card_activatecaINNERJOINbbs_uhome_card_rulescronca.card_brach=cr.card_bachsetca.create_user=cr.create_user; #多表join UPDATEbbs_uhome_card_ordercoINNERJOINbbs_uhome_card_order_recordcoronco.order_no=cor.order_noJOINbbs_uhome_card_activatecaoncor.card_no=ca.card_nosetco.create_user=ca.create_user

到此这篇关于Mysql联表update数据的示例详解的文章就介绍到这了,更多相关Mysql联表update数据内容请搜索<编程笔记>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<编程笔记>!

您可能感兴趣的文章:MySQL执行update语句和原数据相同会再次执行吗mysql事务selectforupdate及数据的一致性处理讲解详解MySQL数据库insert和update语句Mysql数据库死锁过程分析(selectforupdate)MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解mysql多表join时候update更新数据的方法

标签: date update pd 数据 示例 sq te

MySQL主从复制原理以及需要注意的地方

MySQL数据类型优化原则

上述就是数据库技术:Mysql联表update数据的示例详解分享的全部内容,如果对大家有所用处且需要了解更多关于mysql数据库学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
author-avatar
雪儿babyqueenpb_446
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有