日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

sql跨表查询_跨表查询经常有,何为跨表更新?

發布時間:2025/3/21 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql跨表查询_跨表查询经常有,何为跨表更新? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

背景

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

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. C1SET T1.C2 = T2.C2, T2.C3 = exprWHERE condition

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

  • 首先,在 UPDATE 子句之后,指定主表(T1)和希望主表聯接到的表(T2)。請注意,必須在UPDATE 子句之后至少指定一個表
  • 接下來,指定你要使用的聯接類型,即 INNER JOIN 或 LEFT JOIN 以及聯接謂詞。 JOIN子句必須出現在 UPDATE 子句之后(這個大家都是知道的哈)
  • 然后,將新值分配給要更新的 T1或 T2 表中的列
  • 最后,在 WHERE 子句中指定一個條件以將行限制為要更新的行

如果你遵循 update 語法,你會發現有另外一種語法也可以完成跨表更新

UPDATE T1, T2SET T1.c2 = T2.c2, T2.c3 = exprWHERE T1.c1 = T2.c1 AND condition

上面的語法其實隱式使用了 inner join 關鍵字,完全等同于下面的樣子:

UPDATE T1,T2INNER JOIN T2 ON T1.C1 = T2.C1SET T1.C2 = T2.C2, T2.C3 = exprWHERE 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.performanceSET 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.performanceSET salary = salary + salary * 0.015WHERE merits.percentage IS NULL;

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

  • 如果你也恰巧剛知道這個知識點,請點個「贊」
  • 如果你早都知道了這個知識點,還請留言送上「噓聲」
  • 如果你年終獎豐厚,希望你2020年更進一步
  • 如果你和我一樣沒有年終獎,別灰心,我們攜手進步

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

趣味原創解析Java技術棧問題,將復雜問題簡單化,將抽象問題圖形化落地

如果對我的專題內容感興趣,或搶先看更多內容,歡迎訪問我的博客 https://dayarch.top

總結

以上是生活随笔為你收集整理的sql跨表查询_跨表查询经常有,何为跨表更新?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。