成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

數據庫 MySQL 后端
有點 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 子句執行跨表更新,語法就是這樣: 

  1. UPDATE T1, T2,  
  2. [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1  
  3. SET T1.C2 = T2.C2,  
  4.     T2.C3 = expr  
  5. WHERE condition 

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

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

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

  1. UPDATE T1, T2  
  2. SET T1.c2 = T2.c2,  
  3.       T2.c3 = expr  
  4. WHERE T1.c1 = T2.c1 AND condition 

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

  1. UPDATE T1,T2  
  2. INNER JOIN T2 ON T1.C1 = T2.C1  
  3. SET T1.C2 = T2.C2,  
  4.       T2.C3 = expr  
  5. WHERE condition 

個人建議還是加上 inner join 關鍵字吧,這樣可讀性更好,盡享絲滑,你覺得呢?

我摸魚看到的,覺得是靈魂翻譯

談太廉,秀你碼 (Talk is cheap,show me the code)

Update Join 例子

年底了,又到了評績效的時候了,就是那個叫 KPI 的東東(你們有嗎),聽說要根據 KPI 調工資了。有兩張表

第一張表「employees-員工表」

建表語句如下: 

  1. create table employees  
  2.  
  3.     employee_id bigint auto_increment comment '員工ID,主鍵',  
  4.     employee_name varchar(50) null comment '員工名稱',  
  5.     performance int(4) null comment '績效分數 1,2,3,4,5',  
  6.     salary float null comment '員工薪水',  
  7.     constraint employees_pk  
  8.         primary key (employee_id)  
  9.  
  10. comment '員工表'; 

第二張表「merits-績效字典表」

建表語句如下: 

  1. create table merits  
  2.  
  3.     performance int(4) null,  
  4.     percentage float null  
  5.  
  6. comment '績效字典表'; 

先生成一些模擬數據 

  1. -- 績效字典初始化數據  
  2. INSERT INTO merits(performance, percentage)  
  3. VALUES (1, 0),  
  4.        (2, 0.01),  
  5.        (3, 0.03),  
  6.        (4, 0.05),  
  7.        (5, 0.08);  
  8. -- 員工表初始化數據  
  9. INSERT INTO employees(employee_name, performance, salary)  
  10. VALUES ('拱哥', 1, 1000),  
  11.        ('小段總', 3, 20000),  
  12.        ('大人', 4, 18000),  
  13.        ('司令', 5, 28000),  
  14.        ('老六', 2, 10000),  
  15.        ('羅蒙', 3, 20000);    

調薪規則:

原有薪資 + (原有薪資 * 當前績效對應的調薪百分比)

按照調薪規則寫 update 語句: 

  1. UPDATE employees  
  2.     INNER JOIN  
  3.     merits ON employees.performance = merits.performance  
  4. SET salarysalary = salary + salary * percentage; 

拱哥績效不好,沒給漲工資......

三橫一豎一咕嘎,四個小豬🐷來吃zha,咕嘎咕嘎又來倆

臨近年底,公司又來了兩位新同事, 但是公司年度績效已經評完,所以新員工績效為 NULL 

  1. INSERT INTO employees(employee_name, performance, salary)  
  2. VALUES ('馮大', NULL, 8000),  
  3.        ('馮二', NULL, 5000); 

新員工工作干的不錯,也要 1.5% 漲點工資的。如果我們還是用 UPDATE INNER JOIN,按照上面的更新語句是不可能完成的,因為條件等式不成立,這是我們就要用到 UPDATE LEFT JOIN 了 

  1. UPDATE employees  
  2.     LEFT JOIN  
  3.     merits ON employees.performance = merits.performance  
  4. SET salarysalary = salary + salary * 0.015  
  5. WHERE merits.percentage IS NULL; 

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

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

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

歡迎關注我的公眾號 「日拱一兵」,趣味原創解析Java技術棧問題,將復雜問題簡單化,將抽象問題圖形化落地

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

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2011-08-29 15:21:30

2010-09-17 13:35:30

SQL跨表更新

2011-07-14 15:24:26

MSSQL數據庫跨數據庫查詢

2011-07-28 17:02:59

MYSQL數據庫跨表更新數據并合

2023-12-21 18:11:51

數據庫分庫分表跨庫

2010-11-03 11:36:53

訪問DB2表

2020-05-25 09:39:10

Elasticsear查詢分庫分表

2010-09-26 14:21:43

sql跨服務器查詢

2010-11-09 14:47:46

SQL Server跨

2020-09-08 11:21:48

SQL生成器跨庫

2025-02-10 07:05:00

WinFormUI線程

2020-07-13 08:18:58

跨庫查詢MySQL數據庫

2017-07-18 17:07:40

數據庫 MyCATJoin

2010-09-16 15:56:15

SQL Server表

2021-05-27 05:22:28

前端引擎平臺

2019-04-10 10:32:16

CORSNginx反向代理

2009-09-15 13:28:49

LINQ表間關系查詢

2016-11-01 21:51:03

phpjavascript

2016-08-27 22:02:11

前端跨端全棧

2017-06-08 09:40:43

PostgreSQLdblink跨庫查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99欧美精品| 国产精品国产三级国产a | 丝袜一区二区三区 | 涩涩视频大全 | 国产精品国产成人国产三级 | 国产精品一区二区福利视频 | 国产免费一区二区 | 久久亚洲精品国产精品紫薇 | 精品福利一区二区三区 | 51ⅴ精品国产91久久久久久 | 国产精品久久久久久久久图文区 | 99精品久久| 超碰在线人 | 欧美中国少妇xxx性高请视频 | 欧美性一级 | 欧美区日韩区 | 韩国精品在线 | 国产美女福利在线观看 | 亚洲瑟瑟 | 日批日韩在线观看 | 久久午夜国产精品www忘忧草 | 午夜久久久久久久久久一区二区 | 国产一区免费 | 国产在线二区 | 一区二区免费视频 | 国产乱码精品一区二三赶尸艳谈 | 精品久久一区 | 亚洲一区二区 | 99精品久久久久久中文字幕 | 国产欧美精品区一区二区三区 | 久久久久久综合 | 毛片免费看 | 99pao成人国产永久免费视频 | 在线视频一区二区 | 亚洲欧洲成人av每日更新 | 很黄很污的网站 | ririsao久久精品一区 | 91在线视频免费观看 | 中文字幕中文字幕 | 国产精品特级片 | www.久久久久久久久久久久 |