有點 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 語法,你會發現有另外一種語法也可以完成跨表更新
上面的語法其實隱式使用了 inner join 關鍵字,完全等同於下面的樣子:update t1, t2
set t1.c2 = t2.c2,
t2.c3 = expr
where t1.c1 = t2.c1 and condition
個人建議還是加上update t1,t2
inner join t2 on t1.c1 = t2.c1
set t1.c2 = t2.c2,
t2.c3 = expr
where condition
inner join
關鍵字吧,這樣可讀性更好,盡享絲滑,你覺得呢?
我摸魚看到的,覺得是靈魂翻譯年底了,又到了評績效的時候了,就是那個叫 kpi 的東東(你們有嗎),聽說要根據 kpi 調工資了。有兩張表談太廉,秀你碼 (talk is cheap,show me the code)
第一張表「employees-員工表」
建表語句如下:
第二張表「merits-績效字典表」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 '員工表';
建表語句如下:
先生成一些模擬資料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...