sql跨表查询_跨表更新,看到自己写的SQL像个憨憨
有點(diǎn) SQL 基礎(chǔ)的朋友肯定聽過 「跨表查詢」,那啥是跨表更新啊?
背景
項(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 小段總在修仙,想著讓他幫潤色一下?,于是發(fā)給了他,然后甩手回來就是這個(gè)樣子:
看到這個(gè) SQL 語句我都驚呆了,還能這樣寫,在無情的嘲笑下,一聲 KO 我直接倒下。死也得死的明白,咱得查查這是咋回事啊
Mysql Update Join
我們經(jīng)常使用 join 查詢表中具有(在 INNER JOIN 情況下)或可能沒有(在 LEFT JOIN 情況下)另一個(gè)表中匹配行的表中的行。
同樣,在 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
我們還是詳細(xì)的說明一下上面的語法:
- 首先,在 UPDATE 子句之后,指定主表(T1)和希望主表聯(lián)接到的表(T2)。請(qǐng)注意,必須在UPDATE 子句之后至少指定一個(gè)表
- 接下來,指定你要使用的聯(lián)接類型,即 INNER JOIN 或 LEFT JOIN 以及聯(lián)接謂詞。JOIN子句必須出現(xiàn)在 UPDATE 子句之后(這個(gè)大家都是知道的哈)
- 然后,將新值分配給要更新的 T1或 T2 表中的列
- 最后,在 WHERE 子句中指定一個(gè)條件以將行限制為要更新的行
如果你遵循 update 語法,你會(huì)發(fā)現(xiàn)有另外一種語法也可以完成跨表更新
UPDATE T1, T2SET T1.c2 = T2.c2,
T2.c3 = expr
WHERE T1.c1 = T2.c1 AND condition
上面的語法其實(shí)隱式使用了 inner join 關(guān)鍵字,完全等同于下面的樣子:
UPDATE T1,T2INNER JOIN T2 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition
個(gè)人建議還是加上 inner join 關(guān)鍵字吧,這樣可讀性更好,盡享絲滑,你覺得呢?
我摸魚看到的,覺得是靈魂翻譯
談太廉,秀你碼 ?(Talk is cheap,show me the code)
Update Join 例子
年底了,又到了評(píng)績(jī)效的時(shí)候了,就是那個(gè)叫 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 '績(jī)效分?jǐn)?shù) 1,2,3,4,5',
salary float null comment '員工薪水',
constraint employees_pk
primary key (employee_id)
)
comment '員工表';
第二張表「merits-績(jī)效字典表」
建表語句如下:
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 語句:
UPDATE employeesINNER JOIN
merits ON employees.performance = merits.performance
SET salary = salary + salary * percentage;
拱哥績(jī)效不好,沒給漲工資......
三橫一豎一咕嘎,四個(gè)小豬?來吃zha,咕嘎咕嘎又來倆
臨近年底,公司又來了兩位新同事, 但是公司年度績(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àn)闂l件等式不成立,這是我們就要用到 UPDATE LEFT JOIN 了
UPDATE employeesLEFT JOIN
merits ON employees.performance = merits.performance
SET salary = salary + salary * 0.015
WHERE merits.percentage IS NULL;
到這里,新員工的漲薪工作也做完,拱哥由于知識(shí)點(diǎn)了解不透徹,灰溜溜的回家過年
如果你也恰巧剛知道這個(gè)知識(shí)點(diǎn),請(qǐng)點(diǎn)個(gè)「在看Wow」
如果你早都知道了這個(gè)知識(shí)點(diǎn),還請(qǐng)留言送上「噓聲」
如果你年終獎(jiǎng)豐厚,希望你2020年更進(jìn)一步
如果你和我一樣沒有年終獎(jiǎng),別灰心,我們攜手進(jìn)步
這是年前最后一篇文章,這個(gè)時(shí)間還能看這篇文章的一定是真愛了???
新朋友,公眾號(hào)回復(fù)「進(jìn)群」或點(diǎn)擊菜單「加我好友」加我微信,備注「除夕夜」
老朋友,已經(jīng)加過微信的也請(qǐng)留言「過大年」
感謝公眾號(hào)伙伴一年的陪伴和支持,除夕夜會(huì)送上小小的驚喜娛樂一下??,回饋大家,(我會(huì)陸續(xù)將各位拉到群內(nèi),截止到1月23日晚 20:00)
最后,流感嚴(yán)重?,春運(yùn)旅途多加小心,我們年后繼續(xù)相約在這里
加入我的微信圈子,純凈歡快的學(xué)習(xí)環(huán)境在這里
??「轉(zhuǎn)發(fā)」和「在看」,是對(duì)我最大的支持??點(diǎn)擊,獲得更多精彩內(nèi)容總結(jié)
以上是生活随笔為你收集整理的sql跨表查询_跨表更新,看到自己写的SQL像个憨憨的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么执行程序_小鹅通视频怎么
- 下一篇: stringredistemplate设