Command guide
advanced updating MySQL MariaDB SQL Server PostgreSQL SQLite
Update Rows Using Values From Another Table
Use a join inside an `UPDATE` statement to copy or derive values from a related table.
5/5 supported engines validation-green 1 example 2 scenarios
Docker-validated Not currently validation-green
Example 1
Copy department names from a lookup table into the employees table
All three employees have their dept_name filled from the matching row in departments. Ada and Carol both map to Engineering (dept_id 1); Bob maps to Finance (dept_id 2). The NULL values are replaced in a single statement.
Source table data Setup
CREATE TABLE departments (id INT, name VARCHAR(50));
CREATE TABLE employees (
id INT,
name VARCHAR(50),
dept_id INT,
dept_name VARCHAR(50)
);
INSERT INTO
departments (id, name)
VALUES
(1, 'Engineering'),
(2, 'Finance');
INSERT INTO
employees (id, name, dept_id, dept_name)
VALUES
(1, 'Ada', 1, NULL),
(2, 'Bob', 2, NULL),
(3, 'Carol', 1, NULL);
Validated query SQL
UPDATE employees e
INNER JOIN departments d ON e.dept_id = d.id
SET
e.dept_name = d.name;
SELECT
id,
name,
dept_name
FROM
employees
ORDER BY
id;
Expected result | id | name | dept_name |
|---|
| 1 | Ada | Engineering |
| 2 | Bob | Finance |
| 3 | Carol | Engineering |
Source table data Setup
CREATE TABLE departments (id INT, name VARCHAR(50));
CREATE TABLE employees (
id INT,
name VARCHAR(50),
dept_id INT,
dept_name VARCHAR(50)
);
INSERT INTO
departments (id, name)
VALUES
(1, 'Engineering'),
(2, 'Finance');
INSERT INTO
employees (id, name, dept_id, dept_name)
VALUES
(1, 'Ada', 1, NULL),
(2, 'Bob', 2, NULL),
(3, 'Carol', 1, NULL);
Validated query SQL
UPDATE e
SET
e.dept_name = d.name
FROM
employees e
INNER JOIN departments d ON e.dept_id = d.id;
SELECT
id,
name,
dept_name
FROM
employees
ORDER BY
id;
Expected result | id | name | dept_name |
|---|
| 1 | Ada | Engineering |
| 2 | Bob | Finance |
| 3 | Carol | Engineering |
Source table data Setup
CREATE TABLE departments (id INT, name VARCHAR(50));
CREATE TABLE employees (
id INT,
name VARCHAR(50),
dept_id INT,
dept_name VARCHAR(50)
);
INSERT INTO
departments (id, name)
VALUES
(1, 'Engineering'),
(2, 'Finance');
INSERT INTO
employees (id, name, dept_id, dept_name)
VALUES
(1, 'Ada', 1, NULL),
(2, 'Bob', 2, NULL),
(3, 'Carol', 1, NULL);
Validated query SQL
UPDATE employees
SET
dept_name = d.name
FROM
departments d
WHERE
employees.dept_id = d.id;
SELECT
id,
name,
dept_name
FROM
employees
ORDER BY
id;
Expected result | id | name | dept_name |
|---|
| 1 | Ada | Engineering |
| 2 | Bob | Finance |
| 3 | Carol | Engineering |
Source table data Setup
CREATE TABLE departments (id INT, name VARCHAR(50));
CREATE TABLE employees (
id INT,
name VARCHAR(50),
dept_id INT,
dept_name VARCHAR(50)
);
INSERT INTO
departments (id, name)
VALUES
(1, 'Engineering'),
(2, 'Finance');
INSERT INTO
employees (id, name, dept_id, dept_name)
VALUES
(1, 'Ada', 1, NULL),
(2, 'Bob', 2, NULL),
(3, 'Carol', 1, NULL);
Validated query SQL
UPDATE employees
SET
dept_name = (
SELECT
name
FROM
departments
WHERE
departments.id = employees.dept_id
);
SELECT
id,
name,
dept_name
FROM
employees
ORDER BY
id;
Expected result | id | name | dept_name |
|---|
| 1 | Ada | Engineering |
| 2 | Bob | Finance |
| 3 | Carol | Engineering |
MySQL and MariaDB use UPDATE … JOIN … SET. PostgreSQL and SQL Server use UPDATE … SET … FROM. The resulting data is identical.