MySQL UPDATE JOIN

摘要:在本教程中,您将学习如何使用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 conditionCode language: SQL (Structured Query Language) (sql)

让我们更详细地研究一下 MySQL UPDATE JOIN语法:

  • 首先,在UPDATE子句之后指定主表 ( T1 ) 以及您希望主表连接到的表 ( T2 )。请注意,您必须在UPDATE子句后至少指定一个表。 UPDATE子句后未指定的表中的数据将不会被更新。
  • 接下来,指定要使用的连接类型,即INNER JOINLEFT JOIN以及连接谓词。 JOIN子句必须出现在UPDATE子句之后。
  • 然后,为T1和/或T2表中要更新的列分配新值。
  • 之后,在WHERE子句中指定一个条件,将行限制为要更新的行。

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

UPDATE T1, T2
SET T1.c2 = T2.c2,
      T2.c3 = expr
WHERE T1.c1 = T2.c1 AND conditionCode language: SQL (Structured Query Language) (sql)

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 conditionCode language: SQL (Structured Query Language) (sql)

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

MySQL 更新连接示例

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

  • 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);Code language: SQL (Structured Query Language) (sql)

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

假设您想根据员工的绩效调整员工的工资。

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

employeesmerit表之间的联系是performance字段。请参阅以下查询:

UPDATE employees
        INNER JOIN
    merits ON employees.performance = merits.performance 
SET 
    salary = salary + salary * percentage;Code language: SQL (Structured Query Language) (sql)
MySQL Update Join Example

查询如何工作。

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

对于employees表中的每一行,查询将绩效列中的值与merits表中绩效列中的值进行检查。如果找到匹配项,它将获取merits表中的percentage并更新employees表中的salary列。

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

使用 LEFT JOIN 的 MySQL UPDATE JOIN 示例

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

INSERT INTO employees(emp_name,performance,salary)
VALUES('Jack William',NULL,43000),
      ('Ricky Bond',NULL,52000);Code language: SQL (Structured Query Language) (sql)

由于这些员工是新员工,因此他们的绩效数据不可用或为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;Code language: SQL (Structured Query Language) (sql)
MySQL Update Left Join with Example

在本教程中,我们向您展示了如何使用 MySQL UPDATE JOIN以及INNER JOINLEFT JOIN子句来执行跨表更新。

本教程有帮助吗?