有點 SQL 基礎的朋友確定聽過 「跨表查詢」,那啥是跨表更新啊?面試
項目新導入了一批人員數據,這些人的有的部門名稱發生了變化,有的聯繫方式發生了變化,暫且稱該表爲sql
t_dept_members
, 系統中有另一張表 t_user_info
記錄了人員信息。要求將 t_dept_members
中有變化的信息更新到 t_user
表中,這個需求就是「跨表更新」啦工具
不帶腦子出門的就寫出了下面的 SQL學習
看到身後 DBA 小段總在修仙,想着讓他幫潤色一下😜,因而發給了他,而後甩手回來就是這個樣子:ui
看到這個 SQL 語句我都驚呆了,還能這樣寫,在無情的嘲笑下,一聲 KO 我直接倒下。死也得死的明白,咱得查查這是咋回事啊spa
咱們常常使用 join
查詢表中具備(在 INNER JOIN
狀況下)或可能沒有(在 LEFT JOIN
狀況下)另外一個表中匹配行的表中的行。翻譯
一樣,在 MySQL 中, 咱們也能夠在 UPDATE 語句中使用 JOIN 子句執行跨表更新,語法就是這樣:3d
UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition
複製代碼
咱們仍是詳細的說明一下上面的語法:code
若是你遵循 update 語法,你會發現有另一種語法也能夠完成跨表更新orm
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
複製代碼
我的建議仍是加上 inner join
關鍵字吧,這樣可讀性更好,盡享絲滑,你以爲呢?
我摸魚看到的,以爲是靈魂翻譯
談太廉,秀你碼 (Talk is cheap,show me the code)
年末了,又到了評績效的時候了,就是那個叫 KPI 的東東(大家有嗎),據說要根據 KPI 調工資了。有兩張表
第一張表「employees-員工表」
建表語句以下:
create table employees
(
employee_id bigint auto_increment comment '員工ID,主鍵',
employee_name varchar(50) null comment '員工名稱',
performance int(4) null comment '績效分數 1,2,3,4,5',
salary float null comment '員工薪水',
constraint employees_pk
primary key (employee_id)
)
comment '員工表';
複製代碼
第二張表「merits-績效字典表」
建表語句以下:
create table merits
(
performance int(4) null,
percentage float null
)
comment '績效字典表';
複製代碼
先生成一些模擬數據
-- 績效字典初始化數據
INSERT INTO merits(performance, percentage)
VALUES (1, 0),
(2, 0.01),
(3, 0.03),
(4, 0.05),
(5, 0.08);
-- 員工表初始化數據
INSERT INTO employees(employee_name, performance, salary)
VALUES ('拱哥', 1, 1000),
('小段總', 3, 20000),
('大人', 4, 18000),
('司令', 5, 28000),
('老六', 2, 10000),
('羅蒙', 3, 20000);
複製代碼
調薪規則:
原有薪資 + (原有薪資 * 當前績效對應的調薪百分比)
按照調薪規則寫 update 語句:
UPDATE employees
INNER JOIN
merits ON employees.performance = merits.performance
SET salary = salary + salary * percentage;
複製代碼
拱哥績效很差,沒給漲工資......
三橫一豎一咕嘎,四個小豬🐷來吃zha,咕嘎咕嘎又來倆
臨近年末,公司又來了兩位新同事, 可是公司年度績效已經評完,因此新員工績效爲 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;
複製代碼
到這裏,新員工的漲薪工做也作完,拱哥因爲知識點了解不透徹,灰溜溜的回家過年
若是你也恰巧剛知道這個知識點,請點個「贊」
若是你早都知道了這個知識點,還請留言送上「噓聲」
若是你年終獎豐厚,但願你2020年更進一步
若是你和我同樣沒有年終獎,別灰心,咱們攜手進步
流感嚴重😷,春運旅途多加當心
歡迎持續關注公衆號:「日拱一兵」
- 前沿 Java 技術乾貨分享
- 高效工具彙總 | 回覆「工具」
- 面試問題分析與解答
- 技術資料領取 | 回覆「資料」
以讀偵探小說思惟輕鬆趣味學習 Java 技術棧相關知識,本着將複雜問題簡單化,抽象問題具體化和圖形化原則逐步分解技術問題,技術持續更新,請持續關注......