久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql跨表更新怎么實現

136次閱讀
沒有評論

共計 2590 個字符,預計需要花費 7 分鐘才能閱讀完成。

本篇內容介紹了“mysql 跨表更新怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

  背景

項目新導入了一批人員數據,這些人的有的部門名稱發生了變化,有的聯系方式發生了變化,暫且稱該表為

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

憨 B SQL 直接被秒殺

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

看到身后 DBA 小段總在修仙,想著讓他幫潤色一下?,于是發給了他,然后甩手回來就是這個樣子:

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

Mysql Update Join

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

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

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

我們還是詳細的說明一下上面的語法:

  首先,在 UPDATE 子句之后,指定主表(T1)和希望主表聯接到的表(T2)。請注意,必須在 UPDATE 子句之后至少指定一個表

  接下來,指定你要使用的聯接類型,即 INNER JOIN 或 LEFT JOIN 以及聯接謂詞。JOIN 子句必須出現在 UPDATE 子句之后(這個大家都是知道的哈)

  然后,將新值分配給要更新的 T1 或 T2 表中的列

  最后,在 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

個人建議還是加上 inner join 關鍵字吧,這樣可讀性更好,盡享絲滑,你覺得呢?

我摸魚看到的,覺得是靈魂翻譯

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

Update Join 例子

年底了,又到了評績效的時候了,就是那個叫 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 salarysalary = 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 salarysalary = salary + salary * 0.015 WHERE merits.percentage IS NULL;

“mysql 跨表更新怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計2590字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 榆社县| 中牟县| 西城区| 连江县| 芜湖县| 安国市| 云龙县| 阳西县| 泾川县| 礼泉县| 宜宾县| 绵阳市| 南木林县| 吴桥县| 仁怀市| 同心县| 奈曼旗| 小金县| 旬阳县| 卢氏县| 平湖市| 松阳县| 平陆县| 仁化县| 平泉县| 木兰县| 金沙县| 炎陵县| 武汉市| 溧阳市| 镇沅| 鄱阳县| 托克逊县| 宁南县| 沈丘县| 敦化市| 明光市| 龙岩市| 沛县| 定襄县| 乌鲁木齐市|