日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
跨表查詢經(jīng)常有,何為跨表更新?

有點(diǎn) SQL 基礎(chǔ)的朋友肯定聽(tīng)過(guò) 「跨表查詢」,那啥是跨表更新?。?/p>

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到湘陰網(wǎng)站設(shè)計(jì)與湘陰網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋湘陰地區(qū)。

 背景

項(xiàng)目新導(dǎo)入了一批人員數(shù)據(jù),這些人的有的部門名稱發(fā)生了變化,有的聯(lián)系方式發(fā)生了變化,暫且稱該表為

t_dept_members, 系統(tǒng)中有另外一張表 t_user_info 記錄了人員信息。要求將 t_dept_members 中有變化的信息更新到 t_user 表中,這個(gè)需求就是「跨表更新」啦

憨B SQL 直接被秒殺

不帶腦子出門的就寫出了下面的 SQL

看到身后 DBA 小段總在修仙,想著讓他幫潤(rùn)色一下,于是發(fā)給了他,然后甩手回來(lái)就是這個(gè)樣子:?

看到這個(gè) SQL 語(yǔ)句我都驚呆了,還能這樣寫,在無(wú)情的嘲笑下,一聲 KO 我直接倒下。死也得死的明白,咱得查查這是咋回事啊

Mysql Update Join

我們經(jīng)常使用 join 查詢表中具有(在 INNER JOIN 情況下)或可能沒(méi)有(在 LEFT JOIN 情況下)另一個(gè)表中匹配行的表中的行。

同樣,在 MySQL 中, 我們也可以在 UPDATE 語(yǔ)句中使用 JOIN 子句執(zhí)行跨表更新,語(yǔ)法就是這樣: 

 
 
 
 
  1. UPDATE T1, T2,  
  2. [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1  
  3. SET T1.C2 = T2.C2,  
  4.     T2.C3 = expr  
  5. WHERE condition 

我們還是詳細(xì)的說(shuō)明一下上面的語(yǔ)法:

  •  首先,在 UPDATE 子句之后,指定主表(T1)和希望主表聯(lián)接到的表(T2)。請(qǐng)注意,必須在UPDATE 子句之后至少指定一個(gè)表
  •  接下來(lái),指定你要使用的聯(lián)接類型,即 INNER JOIN 或 LEFT JOIN 以及聯(lián)接謂詞。 JOIN子句必須出現(xiàn)在 UPDATE 子句之后(這個(gè)大家都是知道的哈)
  •  然后,將新值分配給要更新的 T1或 T2 表中的列
  •  最后,在 WHERE 子句中指定一個(gè)條件以將行限制為要更新的行

如果你遵循 update 語(yǔ)法,你會(huì)發(fā)現(xiàn)有另外一種語(yǔ)法也可以完成跨表更新 

 
 
 
 
  1. UPDATE T1, T2  
  2. SET T1.c2 = T2.c2,  
  3.       T2.c3 = expr  
  4. WHERE T1.c1 = T2.c1 AND condition 

上面的語(yǔ)法其實(shí)隱式使用了 inner join 關(guān)鍵字,完全等同于下面的樣子: 

 
 
 
 
  1. UPDATE T1,T2  
  2. INNER JOIN T2 ON T1.C1 = T2.C1  
  3. SET T1.C2 = T2.C2,  
  4.       T2.C3 = expr  
  5. WHERE condition 

個(gè)人建議還是加上 inner join 關(guān)鍵字吧,這樣可讀性更好,盡享絲滑,你覺(jué)得呢?

我摸魚看到的,覺(jué)得是靈魂翻譯

談太廉,秀你碼 (Talk is cheap,show me the code)

Update Join 例子

年底了,又到了評(píng)績(jī)效的時(shí)候了,就是那個(gè)叫 KPI 的東東(你們有嗎),聽(tīng)說(shuō)要根據(jù) KPI 調(diào)工資了。有兩張表

第一張表「employees-員工表」

建表語(yǔ)句如下: 

 
 
 
 
  1. create table employees  
  2. (  
  3.     employee_id bigint auto_increment comment '員工ID,主鍵',  
  4.     employee_name varchar(50) null comment '員工名稱',  
  5.     performance int(4) null comment '績(jī)效分?jǐn)?shù) 1,2,3,4,5',  
  6.     salary float null comment '員工薪水',  
  7.     constraint employees_pk  
  8.         primary key (employee_id)  
  9. )  
  10. comment '員工表'; 

第二張表「merits-績(jī)效字典表」

建表語(yǔ)句如下: 

 
 
 
 
  1. create table merits  
  2. (  
  3.     performance int(4) null,  
  4.     percentage float null  
  5. )  
  6. comment '績(jī)效字典表'; 

先生成一些模擬數(shù)據(jù) 

 
 
 
 
  1. -- 績(jī)效字典初始化數(shù)據(jù)  
  2. INSERT INTO merits(performance, percentage)  
  3. VALUES (1, 0),  
  4.        (2, 0.01),  
  5.        (3, 0.03),  
  6.        (4, 0.05),  
  7.        (5, 0.08);  
  8. -- 員工表初始化數(shù)據(jù)  
  9. INSERT INTO employees(employee_name, performance, salary)  
  10. VALUES ('拱哥', 1, 1000),  
  11.        ('小段總', 3, 20000),  
  12.        ('大人', 4, 18000),  
  13.        ('司令', 5, 28000),  
  14.        ('老六', 2, 10000),  
  15.        ('羅蒙', 3, 20000);    

調(diào)薪規(guī)則:

原有薪資 + (原有薪資 * 當(dāng)前績(jī)效對(duì)應(yīng)的調(diào)薪百分比)

按照調(diào)薪規(guī)則寫 update 語(yǔ)句: 

 
 
 
 
  1. UPDATE employees  
  2.     INNER JOIN  
  3.     merits ON employees.performance = merits.performance  
  4. SET salarysalary = salary + salary * percentage; 

拱哥績(jī)效不好,沒(méi)給漲工資......

三橫一豎一咕嘎,四個(gè)小豬來(lái)吃zha,咕嘎咕嘎又來(lái)倆

臨近年底,公司又來(lái)了兩位新同事, 但是公司年度績(jī)效已經(jīng)評(píng)完,所以新員工績(jī)效為 NULL 

 
 
 
 
  1. INSERT INTO employees(employee_name, performance, salary)  
  2. VALUES ('馮大', NULL, 8000),  
  3.        ('馮二', NULL, 5000); 

新員工工作干的不錯(cuò),也要 1.5% 漲點(diǎn)工資的。如果我們還是用 UPDATE INNER JOIN,按照上面的更新語(yǔ)句是不可能完成的,因?yàn)闂l件等式不成立,這是我們就要用到 UPDATE LEFT JOIN 了 

 
 
 
 
  1. UPDATE employees  
  2.     LEFT JOIN  
  3.     merits ON employees.performance = merits.performance  
  4. SET salarysalary = salary + salary * 0.015  
  5. WHERE merits.percentage IS NULL; 

到這里,新員工的漲薪工作也做完,拱哥由于知識(shí)點(diǎn)了解不透徹,灰溜溜的回家過(guò)年

  •  如果你也恰巧剛知道這個(gè)知識(shí)點(diǎn),請(qǐng)點(diǎn)個(gè)「贊」
  •  如果你早都知道了這個(gè)知識(shí)點(diǎn),還請(qǐng)留言送上「噓聲」
  •  如果你年終獎(jiǎng)豐厚,希望你2020年更進(jìn)一步
  •  如果你和我一樣沒(méi)有年終獎(jiǎng),別灰心,我們攜手進(jìn)步

流感嚴(yán)重,春運(yùn)旅途多加小心

歡迎關(guān)注我的公眾號(hào) 「日拱一兵」,趣味原創(chuàng)解析Java技術(shù)棧問(wèn)題,將復(fù)雜問(wèn)題簡(jiǎn)單化,將抽象問(wèn)題圖形化落地

如果對(duì)我的專題內(nèi)容感興趣,或搶先看更多內(nèi)容,歡迎訪問(wèn)我的博客 dayarch.top  


本文標(biāo)題:跨表查詢經(jīng)常有,何為跨表更新?
當(dāng)前路徑:http://www.5511xx.com/article/cdosdod.html