1. MySQL UPDATE JOIN語(yǔ)法
在MySQL中也颤,可以在 UPDATE語(yǔ)句 中使用JOIN
子句執(zhí)行跨表更新洋幻。MySQL UPDATE JOIN的語(yǔ)法如下:
UPDATE T1
[INNER JOIN | LEFT JOIN] T2 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition
更詳細(xì)地看看MySQL UPDATE JOIN
語(yǔ)法:
- 首先,在
UPDATE
子句之后翅娶,指定主表(T1
)和希望主表連接表(T2
)文留。 - 第二,指定一種要使用的連接竭沫,即
INNER JOIN
或LEFT JOIN
和連接條件燥翅。JOIN
子句必須出現(xiàn)在UPDATE
子句之后。 - 第三蜕提,要為要更新的
T1
和/或T2
表中的列分配新值森书。 - 第四,WHERE子句中的條件用于指定要更新的行谎势。
2. 示例
首先凛膏,我們將在這些例子中使用一個(gè)新的示例數(shù)據(jù)庫(kù)(empdb
)。示例數(shù)據(jù)庫(kù)包含2個(gè)表:
-
employees
表將存儲(chǔ)在員工編號(hào)脏榆,姓名猖毫,工作表現(xiàn)和工資的數(shù)據(jù)。 -
merits
表存儲(chǔ)員工績(jī)效和績(jī)效百分比须喂。
以下語(yǔ)句在empdb
示例數(shù)據(jù)庫(kù)中創(chuàng)建表并導(dǎo)入數(shù)據(jù):
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 Minsu', 3, 65000),
('Sue Greenspan', 4, 75000),
('Grace Dell', 5, 125000),
('Nancy Johnson', 3, 85000),
('John Doe', 2, 45000),
('Lily Bush', 3, 55000);
2.1 使用INNER JOIN子句的MySQL UPDATE JOIN示例
假設(shè)想根據(jù)員工的工作表現(xiàn)來(lái)調(diào)整員工的工資吁断。
因此,優(yōu)點(diǎn)百分比存儲(chǔ)在 merits
表中坞生,必須使用 UPDATE INNER JOIN
語(yǔ)句根據(jù)存儲(chǔ)在 merits
表中的百分比來(lái)調(diào)整 employees
表中員工的工資仔役。
employees
和 merits
表之間以是 performance
字段相關(guān)聯(lián)的。 請(qǐng)參閱以下查詢:
UPDATE employees
INNER JOIN
merits ON employees.performance = merits.performance
SET
salary = salary + salary * percentage;
上面查詢語(yǔ)句的工作原理是什么恨胚?
我們僅在 UPDATE
子句之后指定 employees
表骂因,因?yàn)槲覀冎幌敫?employees
表中的數(shù)據(jù)炎咖。
對(duì)于 employees
表中的每一行赃泡,查詢根據(jù) merits
表中 performance
列中的值來(lái)檢查 employees
表中的 performance
列中的值寒波。 如果找到一個(gè)匹配,它將獲得 merits
表中的百分比升熊,并更新 employees
表中的 salary
列俄烁。
mysql> select * from employees; -- 更新之前的數(shù)據(jù)
+--------+---------------+-------------+--------+
| emp_id | emp_name | performance | salary |
+--------+---------------+-------------+--------+
| 1 | Mary Doe | 1 | 50000 |
| 2 | Cindy Minsu | 3 | 65000 |
| 3 | Sue Greenspan | 4 | 75000 |
| 4 | Grace Dell | 5 | 125000 |
| 5 | Nancy Johnson | 3 | 85000 |
| 6 | John Doe | 2 | 45000 |
| 7 | Lily Bush | 3 | 55000 |
+--------+---------------+-------------+--------+
7 rows in set
mysql> UPDATE employees
INNER JOIN
merits ON employees.performance = merits.performance
SET
salary = salary + salary * percentage; -- 執(zhí)行連接更新
Query OK, 6 rows affected
Rows matched: 7 Changed: 6 Warnings: 0
mysql> select * from employees; -- 更新之后的數(shù)據(jù)
+--------+---------------+-------------+--------+
| emp_id | emp_name | performance | salary |
+--------+---------------+-------------+--------+
| 1 | Mary Doe | 1 | 50000 |
| 2 | Cindy Minsu | 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
因?yàn)槭÷粤?UPDATE
語(yǔ)句中的 WHERE
子句,所以 employees
表中的所有記錄都被更新级野。如果需要 performance
等級(jí)大于1的員工才更新薪資页屠,那么 sql
可以這樣寫:
UPDATE employees
INNER JOIN
merits ON employees.performance = merits.performance
SET
salary = salary + salary * percentage
WHERE employees.performance > 1;
使用LEFT JOIN的MySQL UPDATE JOIN示例
假設(shè)公司又雇用了兩名新員工:
INSERT INTO employees(emp_name,performance,salary)
VALUES('Jack William',NULL,43000),
('Ricky Bond',NULL,52000);
因?yàn)檫@些員工是新員工,所以他們的績(jī)效(performance
)數(shù)據(jù)不可用或?yàn)?code>NULL”腿幔現(xiàn)在
employees
表中的數(shù)據(jù)辰企,如下所示:
mysql> SELECT * FROM employees;
+--------+---------------+-------------+--------+
| emp_id | emp_name | performance | salary |
+--------+---------------+-------------+--------+
| 1 | Mary Doe | 1 | 50000 |
| 2 | Cindy Minsu | 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
要計(jì)算新員工的工資,不能使用 UPDATE INNER JOIN
語(yǔ)句(為什么不能况鸣,可參考sql之left join牢贸、right join、inner join的區(qū)別)镐捧,因?yàn)樗鼈兊目?jī)效數(shù)據(jù)在 merits
表中不可用潜索。這就是為什么要使用 UPDATE LEFT JOIN
來(lái)實(shí)現(xiàn)了。
當(dāng) UPDATE LEFT JOIN
語(yǔ)句在另一個(gè)表中沒(méi)有相應(yīng)行時(shí)懂酱,就會(huì)更新表中的一行竹习。
例如,可以使用以下語(yǔ)句將新雇員的工資增加1.5%:
UPDATE employees
LEFT JOIN
merits ON employees.performance = merits.performance
SET
salary = salary + salary * 0.015
WHERE
merits.percentage IS NULL;
執(zhí)行結(jié)果如下:
mysql> UPDATE employees
LEFT JOIN
merits ON employees.performance = merits.performance
SET
salary = salary + salary * 0.015
WHERE
merits.percentage IS NULL;
Query OK, 2 rows affected
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from employees;
+--------+---------------+-------------+--------+
| emp_id | emp_name | performance | salary |
+--------+---------------+-------------+--------+
| 1 | Mary Doe | 1 | 50000 |
| 2 | Cindy Minsu | 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