跨表查詢經常有,何為跨表更新?

2021-10-02 12:47:13 字數 3302 閱讀 8219

有點 sql 基礎的朋友肯定聽過 「跨表查詢」,那啥是跨表更新啊?

專案新匯入了一批人員資料,這些人的有的部門名稱發生了變化,有的****發生了變化,暫且稱該表為

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

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

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

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

我們經常使用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 語法,你會發現有另外一種語法也可以完成跨表更新

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)

年底了,又到了評績效的時候了,就是那個叫 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 salary = 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 salary = salary + salary * 0.015

where merits.percentage is null;

到這裡,新員工的漲薪工作也做完,拱哥由於知識點了解不透徹,灰溜溜的回家過年

流感嚴重?,春運旅途多加小心

mysql跨庫跨表查詢

簡單記錄 select from dysns.uchome pay record,91feile.phpcms game where uchome pay record.uid phpcms game.touserid select from dysns.uchome pay record,91fe...

MySQL 跨表查詢

select 表1列名 表2列名 from 表1 表2 where 條件 select 表1列名 表2列名 from 表1 inner join 表2 on 條件 全內連線 select 表1列名 表2列名 from 表1 left right inner join 表2 on 條件 左 右內連線 ...

sql跨表更新資料

跨表更新資料是我們經常用的乙個操作,特整理一下 原始資料如下,首先是表結構 a dept的初始資料 a emp初始資料 跨表更新sql語句 語句功能,若a emp表中company和a dept中的company相等,更新a emp中deptid 具體寫法一 update e set e.depti...