掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
有點 SQL 基礎(chǔ)的朋友肯定聽過 「跨表查詢」,那啥是跨表更新?。?/p>

站在用戶的角度思考問題,與客戶深入溝通,找到湘陰網(wǎng)站設(shè)計與湘陰網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋湘陰地區(qū)。
背景
項目新導(dǎo)入了一批人員數(shù)據(jù),這些人的有的部門名稱發(fā)生了變化,有的聯(lián)系方式發(fā)生了變化,暫且稱該表為
t_dept_members, 系統(tǒng)中有另外一張表 t_user_info 記錄了人員信息。要求將 t_dept_members 中有變化的信息更新到 t_user 表中,這個需求就是「跨表更新」啦
憨B SQL 直接被秒殺
不帶腦子出門的就寫出了下面的 SQL
看到身后 DBA 小段總在修仙,想著讓他幫潤色一下,于是發(fā)給了他,然后甩手回來就是這個樣子:?
看到這個 SQL 語句我都驚呆了,還能這樣寫,在無情的嘲笑下,一聲 KO 我直接倒下。死也得死的明白,咱得查查這是咋回事啊
Mysql Update Join
我們經(jīng)常使用 join 查詢表中具有(在 INNER JOIN 情況下)或可能沒有(在 LEFT JOIN 情況下)另一個表中匹配行的表中的行。
同樣,在 MySQL 中, 我們也可以在 UPDATE 語句中使用 JOIN 子句執(zhí)行跨表更新,語法就是這樣:
- UPDATE T1, T2,
- [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
- SET T1.C2 = T2.C2,
- T2.C3 = expr
- WHERE condition
我們還是詳細的說明一下上面的語法:
如果你遵循 update 語法,你會發(fā)現(xiàn)有另外一種語法也可以完成跨表更新
- UPDATE T1, T2
- SET T1.c2 = T2.c2,
- T2.c3 = expr
- WHERE T1.c1 = T2.c1 AND condition
上面的語法其實隱式使用了 inner join 關(guān)鍵字,完全等同于下面的樣子:
- UPDATE T1,T2
- INNER JOIN T2 ON T1.C1 = T2.C1
- SET T1.C2 = T2.C2,
- T2.C3 = expr
- WHERE condition
個人建議還是加上 inner join 關(guān)鍵字吧,這樣可讀性更好,盡享絲滑,你覺得呢?
我摸魚看到的,覺得是靈魂翻譯
談太廉,秀你碼 (Talk is cheap,show me the code)
Update Join 例子
年底了,又到了評績效的時候了,就是那個叫 KPI 的東東(你們有嗎),聽說要根據(jù) KPI 調(diào)工資了。有兩張表
第一張表「employees-員工表」
建表語句如下:
- create table employees
- (
- employee_id bigint auto_increment comment '員工ID,主鍵',
- employee_name varchar(50) null comment '員工名稱',
- performance int(4) null comment '績效分數(shù) 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 '績效字典表';
先生成一些模擬數(shù)據(jù)
- -- 績效字典初始化數(shù)據(jù)
- INSERT INTO merits(performance, percentage)
- VALUES (1, 0),
- (2, 0.01),
- (3, 0.03),
- (4, 0.05),
- (5, 0.08);
- -- 員工表初始化數(shù)據(jù)
- INSERT INTO employees(employee_name, performance, salary)
- VALUES ('拱哥', 1, 1000),
- ('小段總', 3, 20000),
- ('大人', 4, 18000),
- ('司令', 5, 28000),
- ('老六', 2, 10000),
- ('羅蒙', 3, 20000);
調(diào)薪規(guī)則:
原有薪資 + (原有薪資 * 當前績效對應(yīng)的調(diào)薪百分比)
按照調(diào)薪規(guī)則寫 update 語句:
- UPDATE employees
- INNER JOIN
- merits ON employees.performance = merits.performance
- SET salarysalary = salary + salary * percentage;
拱哥績效不好,沒給漲工資......
三橫一豎一咕嘎,四個小豬來吃zha,咕嘎咕嘎又來倆
臨近年底,公司又來了兩位新同事, 但是公司年度績效已經(jīng)評完,所以新員工績效為 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 salarysalary = salary + salary * 0.015
- WHERE merits.percentage IS NULL;
到這里,新員工的漲薪工作也做完,拱哥由于知識點了解不透徹,灰溜溜的回家過年
流感嚴重,春運旅途多加小心
歡迎關(guān)注我的公眾號 「日拱一兵」,趣味原創(chuàng)解析Java技術(shù)棧問題,將復(fù)雜問題簡單化,將抽象問題圖形化落地
如果對我的專題內(nèi)容感興趣,或搶先看更多內(nèi)容,歡迎訪問我的博客 dayarch.top

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流