首页 > 其他分享 >UPDATE INNER JOIN和UPDATE LEFT JOIN跨表更新

UPDATE INNER JOIN和UPDATE LEFT JOIN跨表更新

时间:2023-07-05 14:44:39浏览次数:56  
标签:JOIN UPDATE 跨表 表中 performance 103 NULL

UPDATE JOIN 是用于执行跨表更新的 MySQL 语句,这意味着我们可以使用带有 JOIN 子句条件的另一个表来更新一个表。此查询根据PRIMARY KeyFOREIGN Key以及指定的连接条件更新和更改多个表连接的数据。我们可以使用UPDATE 查询一次更新单个或多个列。

一、MySQL Update Join 语法

以下是 UPDATE JOIN 语句将记录修改到 MySQL 表中的基本语法:

UPDATE Tab1, Tab2, [INNER JOIN | LEFT JOIN] Tab1 ON Tab1.C1 = Tab2.C1  
SET Tab1.C2 = Tab2.C2, Tab2.C3 = expression  
WHERE Condition;

在上面的 MySQL UPDATE JOIN 语法中:

首先,我们在 UPDATE 子句之后指定了两个表:主表 (Tab1) 和另一个表 (tab2)。

(1)、在 UPDATE 子句之后,需要指定至少一个表。

(2)、我们指定了JOIN 子句的类型,即INNER JOINLEFT JOIN,它们出现在 UPDATE 子句之后,然后是在 ON 关键字之后指定的连接谓词。

(3)、我们必须将新值分配给 Tab1 和/或 Tab2 中的列,以便修改到表中。

(4)、WHERE 子句条件用于限制要更新的行。

二、UPDATE JOIN 在 MySQL 中是如何工作的?

MySQL中的 UPDATE JOIN 工作过程与上述语法中描述的相同。但有时,我们会发现这个查询单独执行了跨表更新,而不涉及任何连接。以下语法是使用另一个表更新一个表的另一种方法:

两表:

UPDATE Tab1, Tab2,   
SET Tab1.C2 = Tab2.C2, Tab2.C3 = expression   
WHERE Tab1.C1 = Tab2.C1 AND condition;  

注意:condition条件用于限制要更新的行。

上面的语法其实隐式使用了 inner join 关键字,完全等同于下面的样子:

UPDATE T1,T2
INNERJOIN T2 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2,
      T2.C3 = expr
WHERE condition

个人建议还是加上 inner join 关键字吧,这样可读性更好。

三表:

<update id="update1">
        UPDATE Tab1 a,
            Tab2 b,
            Tab3 c
        SET a.pro_name = c.product_name
            WHERE
             a.code_prefix = b.code_prefix
             AND b.prod_id = c.id
             AND a.subtypeno IS NULL
    </update>

让我们举一些例子来了解 UPDATE JOIN 语句在 MySQL 表中是如何工作的。

三、MySQL Update Join 示例

首先,我们将创建两个名为Performance和Employee的表,这两个表通过外键关联。这里,“Performance”是父表,“Employees”是子 表。以下脚本将创建两个表及其记录。

Performance表:

CREATE TABLE Performance (  
    performance INT(11) NOT NULL,  
    percentage FLOAT NOT NULL,  
    PRIMARY KEY (performance)  
); 

接下来,使用 INSERT 语句填充表中的记录。

INSERT INTO Performance (performance, percentage)  
VALUES(101,0),  
      (102,0.01),  
      (103,0.03),  
      (104,0.05),  
      (105,0.08);  

然后,执行 SELECT 查询以验证数据,如下图所示:

mysql> select * from performance;
+-------------+------------+
| performance | percentage |
+-------------+------------+
|         101 |          0 |
|         102 |       0.01 |
|         103 |       0.03 |
|         104 |       0.05 |
|         105 |       0.08 |
+-------------+------------+
5 rows in set (0.00 sec)

Employee表:

CREATE TABLE Employees (  
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,  
    name VARCHAR(255) NOT NULL,  
    performance INT(11) DEFAULT NULL,  
    salary FLOAT DEFAULT NULL,  
    CONSTRAINT fk_performance FOREIGN KEY (performance) REFERENCES Performance (performance)  
);  

接下来,使用 INSERT 语句填充表中的记录。

INSERT INTO Employees (name, performance, salary)        
VALUES('Mary', 101, 55000),  
      ('John', 103, 65000),  
      ('Suzi', 104, 85000),  
      ('Gracia', 105, 110000),  
      ('Nancy Johnson', 103, 95000),  
      ('Joseph', 102, 45000),  
      ('Donald', 103, 50000); 

然后,执行 SELECT 查询以验证数据,如下图所示:

mysql> select * from employees;
+----+---------------+-------------+--------+
| id | name          | performance | salary |
+----+---------------+-------------+--------+
|  1 | Mary          |         101 |  55000 |
|  2 | John          |         103 |  65000 |
|  3 | Suzi          |         104 |  85000 |
|  4 | Gracia        |         105 | 110000 |
|  5 | Nancy Johnson |         103 |  95000 |
|  6 | Joseph        |         102 |  45000 |
|  7 | Donald        |         103 |  50000 |
+----+---------------+-------------+--------+
7 rows in set (0.00 sec)

假设我们想根据员工的表现更新员工的薪水。我们可以使用 UPDATE INNER JOIN 语句更新员工表中员工的薪水,因为绩效百分比存储在绩效表中。

在上面的表格中,我们必须使用绩效字段来连接员工和绩效表。请参阅以下查询:

UPDATE Employees e  
INNER JOIN Performance p   
ON e.performance = p.performance  
SET salary = salary + salary * percentage; 

执行上述语句后,我们会得到下面的输出,其中我们可以看到员工的工资列更新成功。

mysql> select * from employees;
+----+---------------+-------------+--------+
| id | name          | performance | salary |
+----+---------------+-------------+--------+
|  1 | Mary          |         101 |  55000 |
|  2 | John          |         103 |  66950 |
|  3 | Suzi          |         104 |  89250 |
|  4 | Gracia        |         105 | 118800 |
|  5 | Nancy Johnson |         103 |  97850 |
|  6 | Joseph        |         102 |  45450 |
|  7 | Donald        |         103 |  51500 |
+----+---------------+-------------+--------+
7 rows in set (0.00 sec)

让我们了解这个查询在 MySQL 中是如何工作的。在查询中,我们只在 UPDATE 子句之后指定了Employees 表。这是因为我们只想更改Employees 表中的记录,而不是两个表中的记录。

该查询根据“Performance”表的绩效列检查“员工”表中每一行的绩效列值。如果它会得到匹配的绩效列,那么它将获取绩效表中的百分比并更新员工表的薪水列。该查询更新了Employees 表中的所有记录,因为我们没有在UPDATE JOIN 查询中指定WHERE 子句。

五、MySQL INNER JOIN 和 Update Join 使用示例

为了理解 UPDATE JOIN 和 LEFT JOIN,我们首先需要在Employees 表中插入两个新行:

INSERT INTO Employees (name, performance, salary)  
VALUES('William', NULL, 73000),  
      ('Rayan', NULL, 92000); 

由于这些员工是新员工,因此他们的绩效记录不可用。请参阅以下输出:

mysql> select * from employees;
+----+---------------+-------------+--------+
| id | name          | performance | salary |
+----+---------------+-------------+--------+
|  1 | Mary          |         101 |  55000 |
|  2 | John          |         103 |  66950 |
|  3 | Suzi          |         104 |  89250 |
|  4 | Gracia        |         105 | 118800 |
|  5 | Nancy Johnson |         103 |  97850 |
|  6 | Joseph        |         102 |  45450 |
|  7 | Donald        |         103 |  51500 |
|  8 | William       |        NULL |  73000 |
|  9 | Rayan         |        NULL |  92000 |
+----+---------------+-------------+--------+
9 rows in set (0.00 sec)

如果我们想更新新雇员的薪水,我们不能使用 UPDATE INNER JOIN 查询。这是因为他们的性能数据在性能表中不可用。因此,我们将使用 UPDATE LEFT JOIN 语句来满足这一需求。

MySQL 中的 UPDATE LEFT JOIN 语句用于在另一个表的对应行中没有找到记录时更新表中的一行。

例如,如果我们想将新聘员工的工资提高 2.5%,我们可以借助以下语句来做到这一点:

UPDATE Employees e  
LEFT JOIN Performance p   
ON e.performance = p.performance   
SET salary = salary + salary * 0.025  
WHERE p.percentage IS NULL;  

执行上述查询后,我们将得到如下图的输出,其中我们可以看到新入职员工的工资已成功更新。

mysql> select * from employees;
+----+---------------+-------------+--------+
| id | name          | performance | salary |
+----+---------------+-------------+--------+
|  1 | Mary          |         101 |  55000 |
|  2 | John          |         103 |  66950 |
|  3 | Suzi          |         104 |  89250 |
|  4 | Gracia        |         105 | 118800 |
|  5 | Nancy Johnson |         103 |  97850 |
|  6 | Joseph        |         102 |  45450 |
|  7 | Donald        |         103 |  51500 |
|  8 | William       |        NULL |  74825 |
|  9 | Rayan         |        NULL |  94300 |
+----+---------------+-------------+--------+
9 rows in set (0.00 sec)

在本文中,我们学习了 MySQL Update Join 语句,该语句允许我们使用 JOIN 子句条件将另一个表中的新数据更改为一个表中的现有数据。当我们需要修改 WHERE 子句中指定的某些列以及使用 INNER JOIN 或 LEFT JOIN 子句时,此查询非常有用。

 

标签:JOIN,UPDATE,跨表,表中,performance,103,NULL
From: https://www.cnblogs.com/zwh0910/p/17528149.html

相关文章

  • Mybatis-Plus中update()和updateById()将字段更新为null
    目录简介问题描述原因概述源码分析所有策略设置为null的方案方案1:使用UpdateWrapper更新方案2:设置全局的field-strategy(不推荐)方案3:设置某个字段的field-strategy参考文章简介说明本文介绍Mybatis-Plus无法将字段更新为null的原因及解决方法。问题描述用Mybatis-......
  • 分布式数据库 Join 查询设计与实现浅析
    相对于单例数据库的查询操作,分布式数据查询会有很多技术难题。本文记录Mysql分库分表 和ElasticsearchJoin查询的实现思路,了解分布式场景数据处理的设计方案。文章从常用的关系型数据库MySQL的分库分表Join分析,再到非关系型ElasticSearch来分析Join实现策略。逐步......
  • 012双写一致性之定时更新,异步发送短信,异步秒杀逻辑前后端,课程页面前端,课程相关表分析,
    0双写一致性之定时更新#一旦加入缓存,就会出现数据不一致的请请求#双写一致性问题 -1改数据,删缓存-2改数据,改缓存-3定时更新#首页轮播图存在双写一致性问题这个问题 -以现在的技术水平(信号),做不到:改数据删缓存 -能选择的就是定时更新 -轮播......
  • 解决yum update异常中断产生重复包、依赖冲突等问题
    前言事情的起因是执行了yumupdate后,嫌时间长,就手欠儿按了curl+c中断了更新,结果就导致了后面一些列问题问题问题一:Thereareunfinishedtransactionsremaining使用yum相关命令时,一直会有未完成事务的提醒,这时候我们需要完成这个事务。解决方法:使用yum-complete-trans......
  • cvs update 的输出标志/update常用几个参
    update和checkout在执行中,会为每个文件打印一行提示信息,文件的状态通过前面的单个字符指明:Ufile文件按要求从仓库得到更新。用在那些仓库里面有但你的工作目录没有的文件,以及工作目录里面没有修改过,但旧于仓库的文件。PfileU',但是cvs服务......
  • mysql的update更新及delete删表记录where不带索引字段导致死锁
    为什么会发生这种的事故?InnoDB存储引擎的默认事务隔离级别是「可重复读」,但是在这个隔离级别下,在多个事务并发的时候,会出现幻读的问题,所谓的幻读是指在同一事务下,连续执行两次同样的查询语句,第二次的查询语句可能会返回之前不存在的行。因此InnoDB存储引擎自己实现了行锁,通过......
  • saveOrUpdate failed with new sequence number
    Domainobject:<hibernate-mapping><classname="Trade"table="Trades"><idname="seqNum"column="SEQ_NUM"type="long"><generatorclass="sequence"><par......
  • Unable to update index for central http://repo1.maven.org/maven2/
    Unable to update index for central http://repo1.maven.org/maven2/ 就是这句,myeclipse启动后控制台输出这句话:解决办法:1.在myeclipse3.4(我用的这个版本)里面Window => Preferences => Myeclipse Enterprise Workbench => Maven4Myeclipse => Maven=>禁用Downl......
  • update-alternatives 的基本用法
    update-alternatives是Ubuntu的软件多版本管理工具,基本用法为,update-alternatives--install<link><name><path><priority>[--force]例如,我要创建一个符号链接/usr/bin/cmake,它指向实际安装路径/usr/local/bin/cmake,则可以使用如下命令,sudoupdate-alternatives......
  • 【WALT】WALT入口 update_task_ravg() 代码详解
    目录【WALT】WALT入口update_task_ravg()代码详解代码展示代码逻辑⑴ 判断是否进入WALT算法⑵ 获取WALT算法中上一个窗口的开始时间⑶如果任务刚初始化结束⑷ 更新任务及CPU的cycles⑸ 更新任务及CPU的demand及pred_demand⑹ 更新CPU的busytime⑺ 更新任务的p......