Resumo : neste tutorial, você aprenderá como usar a instrução MySQL UPDATE JOIN para realizar a atualização entre tabelas. Mostraremos passo a passo como usar INNER JOIN
cláusula e LEFT JOIN
cláusula com a UPDATE
instrução.
Sintaxe MySQL UPDATE JOIN
Freqüentemente, você usa junções para consultar linhas de uma tabela que possui (no caso de INNER JOIN
) ou não (no caso de LEFT JOIN
) linhas correspondentes em outra tabela.
No MySQL, você também pode usar as JOIN
cláusulas da UPDATE
instrução para atualizar linhas em uma tabela com base nos valores de outra tabela. A UPDATE JOIN
instrução é útil quando você precisa modificar dados em tabelas relacionadas.
A sintaxe do MySQL UPDATE JOIN
é a seguinte:
UPDATE T1
[INNER JOIN | LEFT JOIN] T2 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como funciona:
- Primeiro, especifique a tabela que deseja atualizar após a palavra-chave UPDATE (
T1
). - Segundo, use
INNER JOIN
ouLEFT JOIN
e um predicado de junção. AJOIN
cláusula deve aparecer logo após aUPDATE
cláusula. - Terceiro, atribua novos valores às colunas da
T1
tabela cujos dados você deseja atualizar. - Por fim, especifique uma condição na
WHERE
cláusula para filtrar as linhas para atualização.
Se você seguir o UPDATE
tutorial de instruções, notará que há outra maneira de atualizar os dados nas tabelas usando a seguinte sintaxe:
UPDATE T1
SET T1.c2 = T2.c2,
T2.c3 = expr
WHERE T1.c1 = T2.c1 AND condition;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Esta UPDATE
declaração funciona da mesma forma UPDATE JOIN
que uma cláusula implícita INNER JOIN
. Isso significa que você pode reescrever a afirmação acima da seguinte forma:
UPDATE T1
INNER JOIN T2 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Exemplos de UPDATE JOIN do MySQL
Vamos explorar alguns exemplos de uso da UPDATE JOIN
declaração para uma melhor compreensão.
Criaremos um novo banco de dados chamado hr
que consiste em duas tabelas:
- A
employees
tabela armazena dados de funcionários com identificação, nome, desempenho e salário do funcionário. - A
merits
tabela armazena o desempenho dos funcionários e a porcentagem de mérito.
As instruções a seguir criam e carregam dados no hr
banco de dados de amostra:
CREATE DATABASE IF NOT EXISTS hr;
USE hr;
CREATE TABLE merits (
performance INT PRIMARY KEY,
percentage DEC(5, 2) NOT NULL
);
CREATE TABLE employees (
emp_id INT AUTO_INCREMENT PRIMARY KEY,
emp_name VARCHAR(255) NOT NULL,
performance INT DEFAULT NULL,
salary DEC(5, 2) DEFAULT NULL,
FOREIGN KEY (performance) REFERENCES merits (performance)
);
INSERT INTO merits(performance, percentage)
VALUES
(1, 0),
(2, 0.01),
(3, 0.03),
(4, 0.05),
(5, 0.08);
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);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Exemplo MySQL UPDATE JOIN com cláusula INNER JOIN
Suponha que você queira aumentar o salário de cada funcionário em uma porcentagem com base em seu desempenho.
A instrução a seguir atualiza a salary
coluna da employees
tabela executando um procedimento INNER JOIN
com a merits
tabela com base nos valores correspondentes na performance
coluna:
UPDATE
employees
INNER JOIN merits ON employees.performance = merits.performance
SET
salary = salary + salary * percentage;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
Query OK, 6 rows affected (0.01 sec)
Rows matched: 7 Changed: 6 Warnings: 0
Linguagem de código: CSS ( css )
Como funciona a consulta:
- UPDATE funcionários: Especifica que queremos atualizar a
employees
tabela. - INNER JOIN merits ON empregados.desempenho = méritos.desempenho: Executa um INNER JOIN com a
merits
tabela com base na condição de que osperformance
valores da coluna correspondam entre as tabelasemployees
emerits
. Isso significa que apenas as linhas com valores de desempenho correspondentes em ambas as tabelas serão consideradas para a atualização. - SET salário = salário + salário * percentual: Atualiza a
salary
coluna daemployees
tabela. O salário de cada funcionário é atualizado com base no percentual:salary + salary * percentage
.
Como a UPDATE
instrução não possui a WHERE
cláusula, ela atualiza todas as linhas employees
da tabela.
A instrução a seguir recupera dados da employees
tabela para verificar as atualizações:
SELECT * FROM employees;
Saída:
+--------+---------------+-------------+--------+
| emp_id | emp_name | performance | salary |
+--------+---------------+-------------+--------+
| 1 | Mary Doe | 1 | 50000 |
| 2 | Cindy Smith | 3 | 66950 |
| 3 | Sue Greenspan | 4 | 78750 |
| 4 | Grace Dell | 5 | 135000 |
| 5 | Nancy Johnson | 3 | 87550 |
| 6 | John Doe | 2 | 45450 |
| 7 | Lily Bush | 3 | 56650 |
+--------+---------------+-------------+--------+
7 rows in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
Exemplo de UPDATE JOIN do MySQL com LEFT JOIN
Suponha que a empresa contrate mais dois funcionários:
INSERT INTO employees(emp_name, performance, salary)
VALUES
('Jack William', NULL, 43000),
('Ricky Bond', NULL, 52000);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como esses funcionários são novos contratados, seus dados de desempenho não estão disponíveis ou NULL
:
+--------+---------------+-------------+--------+
| emp_id | emp_name | performance | salary |
+--------+---------------+-------------+--------+
| 1 | Mary Doe | 1 | 50000 |
| 2 | Cindy Smith | 3 | 66950 |
| 3 | Sue Greenspan | 4 | 78750 |
| 4 | Grace Dell | 5 | 135000 |
| 5 | Nancy Johnson | 3 | 87550 |
| 6 | John Doe | 2 | 45450 |
| 7 | Lily Bush | 3 | 56650 |
| 8 | Jack William | NULL | 43000 |
| 9 | Ricky Bond | NULL | 52000 |
+--------+---------------+-------------+--------+
9 rows in set (0.00 sec)
Linguagem de código: PHP ( php )
Para aumentar o salário de novas contratações, não é possível utilizar o UPDATE INNER JOIN
extrato porque seus dados de desempenho não estão disponíveis na merits
tabela. É aqui que a UPDATE LEFT JOIN
declaração vem em socorro.
A UPDATE LEFT JOIN
instrução atualiza uma linha em uma tabela quando ela não possui uma linha correspondente em outra tabela.
Por exemplo, você pode aumentar o salário de uma nova contratação em 1,5% usando a seguinte declaração:
UPDATE
employees
LEFT JOIN merits ON employees.performance = merits.performance
SET
salary = salary + salary * 0.015
WHERE
merits.percentage IS NULL;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
Linguagem de código: CSS ( css )
A instrução a seguir recupera os dados dos funcionários para verificar as atualizações:
SELECT * FROM employees;
Saída:
+--------+---------------+-------------+--------+
| emp_id | emp_name | performance | salary |
+--------+---------------+-------------+--------+
| 1 | Mary Doe | 1 | 50000 |
| 2 | Cindy Smith | 3 | 66950 |
| 3 | Sue Greenspan | 4 | 78750 |
| 4 | Grace Dell | 5 | 135000 |
| 5 | Nancy Johnson | 3 | 87550 |
| 6 | John Doe | 2 | 45450 |
| 7 | Lily Bush | 3 | 56650 |
| 8 | Jack William | NULL | 43645 |
| 9 | Ricky Bond | NULL | 52780 |
+--------+---------------+-------------+--------+
9 rows in set (0.00 sec)
Linguagem de código: PHP ( php )
Resumo
- Use o MySQL
UPDATE JOIN
com as cláusulasINNER JOIN
ouLEFT JOIN
para realizar atualizações entre tabelas.