MySQL UPDATE JOIN

时间:2019-11-20 08:52:07  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL UPDATE JOIN语句执行跨表更新。
我们将逐步向您展示如何在UPDATE语句中使用INNER JOIN子句和LEFT JOIN子句。

MySQL UPDATE JOIN语法

您经常使用联接来查询表中具有(在INNER JOIN的情况下)或可能没有(在LEFT 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)。
    请注意,必须在UPDATE子句之后至少指定一个表。
    在UPDATE子句之后未指定的表中的数据将不会更新。

  • 接下来,指定一种您想要使用的联接,即INNER JOIN或LEFT JOIN以及联接谓词。
    JOIN子句必须出现在UPDATE子句之后。

  • 然后,将新值分配给要更新的T1和/或T2表中的列。

  • 之后,在WHERE子句中指定一个条件以将行限制为要更新的行。

如果您遵循UPDATE语句教程,您将注意到还有另一种使用以下语法更新数据跨表的方法:

UPDATE T1, T2
SET T1.c2 = T2.c2,
      T2.c3 = expr
WHERE T1.c1 = T2.c1 AND condition

此UPDATE语句的工作方式与带有隐式INNER JOIN子句的UPDATE JOIN相同。
这意味着您可以按以下方式重写上面的语句:

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

让我们看一些使用UPDATE JOIN语句以更好地理解的示例。

MySQL UPDATE JOIN示例

我们将使用一个新的示例数据库empdb进行演示。
该示例数据库由两个表组成:

  • 员工表存储具有员工ID,姓名,绩效和薪水的员工数据。

  • 优点表存储员工的绩效和绩效百分比。

以下语句在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 Smith', 3, 65000),
      ('Sue Greenspan', 4, 75000),
      ('Grace Dell', 5, 125000),
      ('Nancy Johnson', 3, 85000),
      ('John Doe', 2, 45000),
      ('Lily Bush', 3, 55000);

带有INNER JOIN子句的MySQL UPDATE JOIN示例

假设您要根据员工的绩效来调整他们的工资。

优点的百分比存储在优点表中,因此,您必须使用UPDATE INNER JOIN语句根据优点表​​中存储的百分比调整雇员表中的雇员薪水。

员工和绩效表之间的链接是``绩效''字段。
请参阅以下查询:

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

查询的工作方式。

我们只在UPDATE子句后指定employees表,因为我们只想更新employee表中的数据。

对于employees表中的每一行,该查询都会将性能列中的值与优点表中性能列中的值进行比较。
如果找到匹配项,它将获取价值表中的百分比并更新员工表中的薪水列。

因为我们在UPDATE语句中省略了WHERE子句,所以employee表中的所有记录都被更新了。

带有LEFT JOIN的MySQL UPDATE JOIN示例

假设公司再雇用两名员工:

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

因为这些员工是新员工,所以他们的绩效数据不可用或为NULL。

要增加新员工的薪水,您不能使用UPDATE INNER JOIN语句,因为其绩效数据在绩效表中不可用。
这就是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 JOIN和INNER JOIN和LEFT JOIN子句来执行跨表更新。