MySQL跨表查詢與跨表更新
有點(diǎn) SQL 基礎(chǔ)的朋友肯定聽(tīng)過(guò) 「跨表查詢」,那啥是跨表更新???
背景
項(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ǔ)法就是這樣:
UPDATE T1, T2, [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1 SET T1.C2 = T2.C2, T2.C3 = expr 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ǔ)法也可以完成跨表更新
UPDATE T1, T2 SET T1.c2 = T2.c2, T2.c3 = expr WHERE T1.c1 = T2.c1 AND condition
上面的語(yǔ)法其實(shí)隱式使用了 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
個(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ǔ)句如下:
create table employees ( employee_id bigint auto_increment comment '員工ID,主鍵', employee_name varchar(50) null comment '員工名稱', performance int(4) null comment '績(jī)效分?jǐn)?shù) 1,2,3,4,5', salary float null comment '員工薪水', constraint employees_pk primary key (employee_id) ) comment '員工表';
第二張表「merits-績(jī)效字典表」
建表語(yǔ)句如下:
create table merits ( performance int(4) null, percentage float null ) comment '績(jī)效字典表';
先生成一些模擬數(shù)據(jù)
-- 績(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ī)則:原有薪資 + (原有薪資 * 當(dāng)前績(jī)效對(duì)應(yīng)的調(diào)薪百分比)
按照調(diào)薪規(guī)則寫 update 語(yǔ)句:
UPDATE employees INNER JOIN merits ON employees.performance = merits.performance SET salary = salary + salary * percentage;
拱哥績(jī)效不好,沒(méi)給漲工資......
三橫一豎一咕嘎,四個(gè)小豬🐷來(lái)吃zha,咕嘎咕嘎又來(lái)倆
臨近年底,公司又來(lái)了兩位新同事, 但是公司年度績(jī)效已經(jīng)評(píng)完,所以新員工績(jī)效為 NULL
INSERT INTO employees(employee_name, performance, salary) VALUES ('馮大', NULL, 8000), ('馮二', NULL, 5000);
新員工工作干的不錯(cuò),也要 1.5%
漲點(diǎn)工資的。如果我們還是用 UPDATE INNER JOIN
,按照上面的更新語(yǔ)句是不可能完成的,因?yàn)闂l件等式不成立,這是我們就要用到 UPDATE LEFT JOIN
了
UPDATE employees LEFT JOIN merits ON employees.performance = merits.performance SET salary = salary + salary * 0.015 WHERE merits.percentage IS NULL;
到這里,新員工的漲薪工作也做完,拱哥由于知識(shí)點(diǎn)了解不透徹,灰溜溜的回家過(guò)年
相關(guān)文章
MySql數(shù)據(jù)庫(kù)時(shí)間序列間隔查詢方式
這篇文章主要介紹了MySql數(shù)據(jù)庫(kù)時(shí)間序列間隔查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05MySQL中字段類型為longtext的值導(dǎo)出后顯示二進(jìn)制串方式
這篇文章主要介紹了MySQL中字段類型為longtext的值導(dǎo)出后顯示二進(jìn)制串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07mysql MGR 單主多主模式切換知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理了關(guān)于mysql MGR 單主多主模式切換知識(shí)點(diǎn)詳解內(nèi)容,需要的朋友們可以參考下。2020-03-03如何利用MySQL的binlog恢復(fù)誤刪數(shù)據(jù)庫(kù)詳解
MySQL一旦誤刪數(shù)據(jù)庫(kù)之后恢復(fù)數(shù)據(jù)很麻煩,這里記錄一下艱辛的恢復(fù)過(guò)程,這篇文章主要給大家介紹了關(guān)于如何利用MySQL的binlog恢復(fù)誤刪數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2021-09-09wamp中mysql安裝時(shí)能啟動(dòng)重啟后無(wú)法啟動(dòng)的解決辦法
這篇文章主要介紹了wamp中mysql安裝時(shí)能啟動(dòng)重啟后無(wú)法啟動(dòng)的解決辦法 ,需要的朋友可以參考下2018-08-08MySQL權(quán)限USAGE和ALL PRIVILEGES的用法
本文主要介紹了MySQL權(quán)限USAGE和ALL PRIVILEGES的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09mysql8.0 用戶角色管理及授權(quán)的實(shí)現(xiàn)
MySQL是一種常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它提供了強(qiáng)大的安全機(jī)制來(lái)管理用戶權(quán)限,本文主要介紹了mysql8.0 用戶角色管理及授權(quán)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04MySQL導(dǎo)入.CSV數(shù)據(jù)中文亂碼的解決方式
當(dāng)將xls或xlsx文件轉(zhuǎn)換為CSV并導(dǎo)入數(shù)據(jù)庫(kù)時(shí),可能出現(xiàn)亂碼,原因是編碼格式不是UTF-8,解決方法是使用Notepad或記事本打開(kāi)CSV文件,所以本文給大家介紹了MySQL導(dǎo)入.CSV數(shù)據(jù)中文亂碼的解決方式,需要的朋友可以參考下2024-08-08