MySQL 更新连接

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

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

MySQL UPDATE JOIN 语法

您经常使用连接从表中查询在另一个表中具有(在 情况下 INNER JOIN )或可能没有(在 情况下 LEFT JOIN )匹配行的行。在 MySQL 中,可以使用 JOIN 语句中的子句 UPDATE 进行跨表更新。

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

让我们 UPDATE JOIN 更详细地检查 MySQL语法:

  • 首先,在子句后指定主表 ( T1 ) 和希望主表加入的表 ( T2 ) UPDATE 。请注意,您必须在 UPDATE 子句后至少指定一个表。 UPDATE 子句后未指定的表中数据不会更新。
  • 接下来,指定您要使用的连接类型,即 INNER JOIN or 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 语句 UPDATE JOIN 与隐式 INNER 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 in的新示例数据库进行演示。此示例数据库由两个表组成:

  • 该 employees 表存储员工数据,包括员工 ID、姓名、绩效和薪水。
  • 该 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 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 实例

假设您想根据员工的表现调整他们的工资。

绩效百分比存储在 merits 表中,因此您必须使用该 UPDATE INNER JOIN 语句 employees 根据 percentage 存储在表中的数据来调整表中员工的工资 merits 。

employees 和 merit 表之间的链接是 performance 字段。请参阅以下查询:

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

MySQL 更新连接实例
MySQL 更新连接实例

查询如何工作。

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

对于 employees 表中的每一行,查询会根据表中性能列中的值检查性能列中的值 merits 。如果找到匹配,它得到了 percentage 在 merits 表中,并更新 salary 列 employees 表。

因为我们省略了 WHERE 语句中的子句,所以 UPDATE 表中的所有记录 employees 都会得到更新。

带有 LEFT JOIN 的 MySQL UPDATE JOIN 实例

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

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

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

MySQL 更新左连接实例

要增加新员工的工资,您不能使用该 UPDATE INNER JOIN 语句,因为 merit 表中没有他们的绩效数据。这就是为什么 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 更新左连接实例
MySQL 更新左连接实例

在本教程中,我们向您展示了如何使用 UPDATE JOIN 带有 INNER JOIN and LEFT JOIN 子句的 MySQL来执行跨表更新。