MySQL update使用select的結(jié)果

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 JOINLEFT 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 表中員工的工資仔役。
employeesmerits 表之間以是 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

擴(kuò)展閱讀

sql之left join列牺、right join整陌、inner join的區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瞎领,隨后出現(xiàn)的幾起案子蔓榄,更是在濱河造成了極大的恐慌,老刑警劉巖默刚,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甥郑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荤西,警方通過(guò)查閱死者的電腦和手機(jī)澜搅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邪锌,“玉大人勉躺,你說(shuō)我怎么就攤上這事∶俜幔” “怎么了饵溅?”我有些...
    開(kāi)封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妇萄。 經(jīng)常有香客問(wèn)我蜕企,道長(zhǎng)咬荷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任轻掩,我火速辦了婚禮幸乒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唇牧。我一直安慰自己罕扎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布丐重。 她就那樣靜靜地躺著腔召,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扮惦。 梳的紋絲不亂的頭發(fā)上宴咧,一...
    開(kāi)封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音径缅,去河邊找鬼掺栅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纳猪,可吹牛的內(nèi)容都是我干的氧卧。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼氏堤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沙绝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鼠锈,我...
    開(kāi)封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闪檬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后购笆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粗悯,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年同欠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了样傍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铺遂,死狀恐怖衫哥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情襟锐,我是刑警寧澤撤逢,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響蚊荣,放射性物質(zhì)發(fā)生泄漏初狰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一妇押、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姓迅,春花似錦敲霍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至解寝,卻和暖如春扩然,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聋伦。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工夫偶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人觉增。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓兵拢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逾礁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子说铃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361