項目新導入了一批人員數據,這些人的有的部門名稱發生了變化,有的聯繫方式發生了變化,暫且稱該表爲t_dept_members, 系統中有另一張表 t_user_info 記錄了人員信息。html
要求將 t_dept_members 中有變化的信息更新到 t_user 表中,這個需求就是「跨表更新」啦mysql
不帶腦子出門的就寫出了下面的 SQLsql
看到身後 DBA 在修仙,想着讓他幫潤色一下,因而發給了他,而後甩手回來就是這個樣子:segmentfault
看到這個 SQL 語句我都驚呆了,還能這樣寫,咱得查查這是咋回事啊spa
咱們常常使用 join 查詢表中具備(在 INNER JOIN 狀況下)或可能沒有(在 LEFT JOIN 狀況下)另外一個表中匹配行的表中的行。3d
一樣,在 MySQL 中, 咱們也能夠在 UPDATE 語句中使用 JOIN 子句執行跨表更新,語法就是這樣:code
UPDATE T1, T2, [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition
咱們仍是詳細的說明一下上面的語法:orm
首先,在 UPDATE 子句以後,指定主表(T1)和但願主表聯接到的表(T2)。請注意,必須在UPDATE 子句以後至少指定一個表
接下來,指定你要使用的聯接類型,即 INNER JOIN 或 LEFT JOIN 以及聯接謂詞。 JOIN子句必須出如今 UPDATE 子句以後(這個你們都是知道的哈)htm
而後,將新值分配給要更新的 T1或 T2 表中的列blog
最後,在 WHERE 子句中指定一個條件以將行限制爲要更新的行
若是你遵循 update 語法,你會發現有另一種語法也能夠完成跨表更新
UPDATE T1, T2 SET T1.c2 = T2.c2, T2.c3 = expr WHERE T1.c1 = T2.c1 AND condition
上面的語法其實隱式使用了 inner join 關鍵字,徹底等同於下面的樣子:
UPDATE T1,T2 INNER JOIN T2 ON T1.C1 = T2.C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition
年末了,又到了評績效的時候了,據說要根據 KPI 調工資了。有兩張表
第一張表「employees-員工表」
第二張表「merits-績效字典表」
數據以下
調薪規則:原有薪資 + (原有薪資 * 當前績效對應的調薪百分比)
按照調薪規則寫 update 語句:
UPDATE employees INNER JOIN merits ON employees.performance = merits.performance SET salary = salary + salary * percentage;
臨近年末,公司又來了兩位新同事, 可是公司年度績效已經評完,因此新員工績效爲 NULL
INSERT INTO employees(employee_name, performance, salary) VALUES ('馮大', NULL, 8000), ('馮二', NULL, 5000);
新員工工做乾的不錯,也要 1.5% 漲點工資的。若是咱們仍是用 UPDATE INNER JOIN,按照上面的更新語句是不可能完成的,由於條件等式不成立,這是咱們就要用到 UPDATE LEFT JOIN 了
UPDATE employees LEFT JOIN merits ON employees.performance = merits.performance SET salary = salary + salary * 0.015 WHERE merits.percentage IS NULL;
到這裏,新員工的漲薪工做也作完