Mysql联表update数据的示例详解

1.MySQL UPDATE JOIN语法

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

UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2,
 T2.C3 = expr
WHERE condition

更详细地看看MySQL UPDATE JOIN语法:

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

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

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

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

2. 示例

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

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

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

CREATE DATABASE IF NOT EXISTS empdb;

USE empdb;
-- create tables
CREATE TABLE merits (
 performance INT(11) NOT NULL,
 percentage FLOAT NOT NULL,
 PRIMARY KEY (performance)
);

CREATE TABLE employees (
 emp_id INT(11) NOT NULL AUTO_INCREMENT,
 emp_name VARCHAR(255) NOT NULL,
 performance INT(11) DEFAULT NULL,
 salary FLOAT DEFAULT NULL,
 PRIMARY KEY (emp_id),
 CONSTRAINT fk_performance FOREIGN KEY (performance)
  REFERENCES merits (performance)
);

-- insert data for merits table
INSERT INTO merits(performance,percentage)
VALUES(1,0),
  (2,0.01),
  (3,0.03),
  (4,0.05),
  (5,0.08);

-- insert data for employees table
INSERT INTO employees(emp_name,performance,salary)
VALUES('Mary Doe', 1, 50000),
  ('Cindy Minsu', 3, 65000),
  ('Sue Greenspan', 4, 75000),
  ('Grace Dell', 5, 125000),
  ('Nancy Johnson', 3, 85000),
  ('John Doe', 2, 45000),
  ('Lily Bush', 3, 55000);

2.1 使用INNER JOIN子句的MySQL UPDATE JOIN示例

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

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

mysql> select * from employees; -- 更新之前的数据
+--------+---------------+-------------+--------+
| emp_id | emp_name  | performance | salary |
+--------+---------------+-------------+--------+
|  1 | Mary Doe  |   1 | 50000 |
|  2 | Cindy Minsu |   3 | 65000 |
|  3 | Sue Greenspan |   4 | 75000 |
|  4 | Grace Dell |   5 | 125000 |
|  5 | Nancy Johnson |   3 | 85000 |
|  6 | John Doe  |   2 | 45000 |
|  7 | Lily Bush  |   3 | 55000 |
+--------+---------------+-------------+--------+
7 rows in set

mysql> UPDATE employees
  INNER JOIN
 merits ON employees.performance = merits.performance
SET
 salary = salary + salary * percentage; -- 执行连接更新
Query OK, 6 rows affected
Rows matched: 7 Changed: 6 Warnings: 0

mysql> select * from employees; -- 更新之后的数据
+--------+---------------+-------------+--------+
| emp_id | emp_name  | performance | salary |
+--------+---------------+-------------+--------+
|  1 | Mary Doe  |   1 | 50000 |
|  2 | Cindy Minsu |   3 | 66950 |
|  3 | Sue Greenspan |   4 | 78750 |
|  4 | Grace Dell |   5 | 135000 |
|  5 | Nancy Johnson |   3 | 87550 |
|  6 | John Doe  |   2 | 45450 |
|  7 | Lily Bush  |   3 | 56650 |
+--------+---------------+-------------+--------+
7 rows in set

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

UPDATE employees
  INNER JOIN
 merits ON employees.performance = merits.performance
SET
 salary = salary + salary * percentage
WHERE employees.performance > 1;

2.2使用LEFT JOIN的MySQL UPDATE JOIN示例

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

INSERT INTO employees(emp_name,performance,salary)
VALUES('Jack William',NULL,43000),
  ('Ricky Bond',NULL,52000);

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

mysql> SELECT * FROM employees;
+--------+---------------+-------------+--------+
| emp_id | emp_name  | performance | salary |
+--------+---------------+-------------+--------+
|  1 | Mary Doe  |   1 | 50000 |
|  2 | Cindy Minsu |   3 | 66950 |
|  3 | Sue Greenspan |   4 | 78750 |
|  4 | Grace Dell |   5 | 135000 |
|  5 | Nancy Johnson |   3 | 87550 |
|  6 | John Doe  |   2 | 45450 |
|  7 | Lily Bush  |   3 | 56650 |
|  8 | Jack William | NULL  | 43000 |
|  9 | Ricky Bond | NULL  | 52000 |
+--------+---------------+-------------+--------+
9 rows in set

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

UPDATE employees
  LEFT JOIN
 merits ON employees.performance = merits.performance
SET
 salary = salary + salary * 0.015
WHERE
 merits.percentage IS NULL;

执行结果如下:

mysql> UPDATE employees
  LEFT JOIN
 merits ON employees.performance = merits.performance
SET
 salary = salary + salary * 0.015
WHERE
 merits.percentage IS NULL;
Query OK, 2 rows affected
Rows matched: 2 Changed: 2 Warnings: 0

mysql> select * from employees;
+--------+---------------+-------------+--------+
| emp_id | emp_name  | performance | salary |
+--------+---------------+-------------+--------+
|  1 | Mary Doe  |   1 | 50000 |
|  2 | Cindy Minsu |   3 | 66950 |
|  3 | Sue Greenspan |   4 | 78750 |
|  4 | Grace Dell |   5 | 135000 |
|  5 | Nancy Johnson |   3 | 87550 |
|  6 | John Doe  |   2 | 45450 |
|  7 | Lily Bush  |   3 | 56650 |
|  8 | Jack William | NULL  | 43645 |
|  9 | Ricky Bond | NULL  | 52780 |
+--------+---------------+-------------+--------+
9 rows in set

示例

# 单表join
update bbs_uhome_card_activate ca INNER JOIN bbs_uhome_card_rules cr on ca.card_brach=cr.card_bach set ca.create_user=cr.create_user;

# 多表join
UPDATE bbs_uhome_card_order co INNER JOIN bbs_uhome_card_order_record cor on co.order_no=cor.order_no JOIN bbs_uhome_card_activate ca on cor.card_no=ca.card_no set co.create_user=ca.create_user

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

(0)

相关推荐

  • mysql多表join时候update更新数据的方法

    sql语句: 复制代码 代码如下: update item i,resource_library r,resource_review_link l set i.name=CONCAT('Review:',r.resource_name) where i.item_id=l.instance_id and l.level='item' and r.resource_id=l.resource_id and i.name='' JOIN UPDATE & JOIN DELETE 复制代码 代码如下:

  • mysql事务select for update及数据的一致性处理讲解

    MySQL中的事务,默认是自动提交的,即autocommit = 1: 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, 如果我们把autocommit关闭掉[autocommit = 0],通过程序来控制,只要一次commit就可以了,这样也才能更好的体现事务的特点! 对于需要操作数值,比如金额,个数等等! 记住一个原则:一锁二判三更新 在MySQL的InnoDB中,预设的Tansaction isolation lev

  • MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解

    MySQL数据库insert和update语句引:用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE. 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就 是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UP

  • 详解MySQL数据库insert和update语句

    用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.SQL语句中的更新语句update是最常用的语句之一,言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE. 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就 是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.

  • Mysql 数据库死锁过程分析(select for update)

    近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁住获取数据的数据段,保证多台机器不拿到相同的数据. 我们Mysql的存储引擎是innodb,支持行锁.解决同时拿数据的方法有很多,为了更加简单,不增加其他表和服务的情况下,我们考虑采用select... for update的方式,这样X锁锁住查询的数据段,表里其他数据没有锁,其他业务逻辑还是可以操作. 这样一台服务器比如select .. for upda

  • MySQL执行update语句和原数据相同会再次执行吗

    背景 本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗? 测试环境 MySQL5.7.25 Centos 7.4 binlog_format为ROW 参数 root@localhost : (none) 04:53:15> show variables like 'binlog_row_image'; +------------------+-------+ | Variable_name | Value | +------

  • Mysql联表update数据的示例详解

    1.MySQL UPDATE JOIN语法 在MySQL中,可以在 UPDATE语句 中使用JOIN子句执行跨表更新.MySQL UPDATE JOIN的语法如下: UPDATE T1, T2, [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition 更详细地看看MySQL UPDATE JOIN语法: 首先,在UPDATE子句之后,指定主表(T1)和希望主表连接表

  • Oracle 数据仓库ETL技术之多表插入语句的示例详解

    目录 创建示例表 无条件的 INSERT ALL 语句 有条件的 INSERT ALL 语句 有条件的 INSERT FIRST 语句 多表插入语句的限制 大家好!我是只谈技术不剪发的 Tony 老师. ETL(提取.转换.加载)是指从源系统中提取数据并将其放入数据仓库的过程.Oracle 数据库为 ETL 流程提供了丰富的功能,今天我们就给大家介绍一下 Oracle 多表插入语句,也就是INSERT ALL语句. 创建示例表 我们首先创建一个源数据表和三个目标表: CREATE TABLE s

  • 利用MySqlBulkLoader实现批量插入数据的示例详解

    目录 介绍 1.将List转化为DataTable 2.将DataTable转换为标准的CSV文件 3.CSV文件导入数据到数据库 4.使用MySqlBulkLoader批量插入数据 5.完整的代码 介绍 最近在项目中遇到插入数据瓶颈,几万.几十万.几百万的数据保存到MYSQL数据库,使用EF插入数据速度非常慢,数据量非常大时EF插入需要几十分钟,甚至几个小时,这样子的速度肯定不是我们所期望的. 后面经过了解与研究发现MySqlBulkLoader,可以批量将数据插入到数据库并且速度上面远远优于

  • MySQL 清除表空间碎片的实例详解

    MySQL 清除表空间碎片的实例详解 碎片产生的原因 (1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白.被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大: (2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片: (3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分: 例如: 一个表有1万行

  • Python实现批量采集商品数据的示例详解

    目录 本次目的 知识点 开发环境 代码 本次目的 python批量采集某商品数据 知识点 requests 发送请求 re 解析网页数据 json 类型数据提取 csv 表格数据保存 开发环境 python 3.8 pycharm requests 代码 导入模块 import json import random import time import csv import requests import re import pymysql 核心代码 # 连接数据库 def save_sql(t

  • C语言实现顺序表的基本操作的示例详解

    目录 一.认识顺序表 1.线性表 2.顺序表的概念及结构 二.顺序表的基本操作(接口实现) 1.初始化顺序表 2.打印顺序表 3.尾插 4.尾删 5.扩容 6.头插 7.头删 8.任意位置插入 9.任意位置删除 10.查找某个数的位置 三.顺序表演示及代码(含源码) 1.演示效果 2.完整源代码 一.认识顺序表 1.线性表 线性表是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表有顺序表.链表.栈.队列.字符串……线性表在逻辑上是线性结构,也就是说是一条

  • MPAndroidChart绘制自定义运动数据图表示例详解

    目录 引言 TimeAxis SportYAxis CustomLineChart 引言 声明:文中的MPChart代指MPAndroidChart. 本系列之前的文章介绍的MPChart中BarChart相关的一些绘制,接下来我们看看LineChart相关的绘制. 这里以实际的运动相关的图表数据做业务支撑来讲解.MPChart图表支持多指触控方法,这里所有的图表自定义都关掉了这个属性,这样就减少Transformer,以及绘制过程中的更多的变动,相当于一个静态的图. 通常图表在放大的过程中,坐

  • TensorFlow人工智能学习创建数据实现示例详解

    目录 一.数据创建 1.tf.constant() 2.tf.convert_to_tensor() 3.tf.zeros() 4.tf.fill() 二.数据随机初始化 ①tf.random.normal() ②tf.random.truncated_normal() ③tf.random.uniform() ④tf.random.shuffle() 一.数据创建 1.tf.constant() 创建自定义类型,自定义形状的数据,但不能创建类似于下面In [59]这样的,无法解释的数据. 2.

  • JavaWeb实现表单提交的示例详解

    目录 register.html RegisterServlet.java 修改web.xml,添加如下code 重新配置服务器 先点击左侧图标 再点击Redeploy,重新部署Tomcat服务器 访问表单页面 register.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <ht

  • 详解Python中生成随机数据的示例详解

    目录 随机性有多随机 加密安全性 PRNG random 模块 数组 numpy.random 相关数据的生成 random模块与NumPy对照表 CSPRNG 尽可能随机 os.urandom() secrets 最佳保存方式 UUID 工程随机性的比较 在日常工作编程中存在着各种随机事件,同样在编程中生成随机数字的时候也是一样,随机有多随机呢?在涉及信息安全的情况下,它是最重要的问题之一.每当在 Python 中生成随机数据.字符串或数字时,最好至少大致了解这些数据是如何生成的. 用于在 P

随机推荐