最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL跨表查詢與跨表更新

 更新時間:2020年02月04日 09:39:20   作者:日拱一兵  
本文主要給大家講解的是MySQL中如何使用跨表更新的方法和示例,非常的實(shí)用,有需要的小伙伴可以查看查看

有點(diǎn) SQL 基礎(chǔ)的朋友肯定聽過 「跨表查詢」,那啥是跨表更新???

背景

項目新導(dǎo)入了一批人員數(shù)據(jù),這些人的有的部門名稱發(fā)生了變化,有的聯(lián)系方式發(fā)生了變化,暫且稱該表為

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

憨B SQL 直接被秒殺

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

看到身后 DBA 小段總在修仙,想著讓他幫潤色一下😜,于是發(fā)給了他,然后甩手回來就是這個樣子:

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

Mysql Update Join

我們經(jīng)常使用 join 查詢表中具有(在 INNER JOIN 情況下)或可能沒有(在 LEFT JOIN 情況下)另一個表中匹配行的表中的行。

同樣,在 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)。請注意,必須在UPDATE 子句之后至少指定一個表接下來,指定你要使用的聯(lián)接類型,即 INNER JOIN 或 LEFT JOIN 以及聯(lián)接謂詞。 JOIN子句必須出現(xiàn)在 UPDATE 子句之后(這個大家都是知道的哈)然后,將新值分配給要更新的 T1或 T2 表中的列最后,在 WHERE 子句中指定一個條件以將行限制為要更新的行

如果你遵循 update 語法,你會發(fā)現(xiàn)有另外一種語法也可以完成跨表更新

UPDATE T1, T2
SET T1.c2 = T2.c2,
   T2.c3 = expr
WHERE T1.c1 = T2.c1 AND condition

上面的語法其實(shí)隱式使用了 inner join 關(guān)鍵字,完全等同于下面的樣子:

UPDATE T1,T2
INNER JOIN T2 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2,
   T2.C3 = expr
WHERE condition

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

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

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

Update Join 例子

年底了,又到了評績效的時候了,就是那個叫 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ǐn)?shù) 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 '績效字典表';

先生成一些模擬數(shù)據(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)前績效對應(yīng)的調(diào)薪百分比)

按照調(diào)薪規(guī)則寫 update 語句:

UPDATE employees
  INNER JOIN
  merits ON employees.performance = merits.performance
SET salary = salary + salary * percentage;

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

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

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

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

新員工工作干的不錯,也要 1.5% 漲點(diǎn)工資的。如果我們還是用 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;

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

相關(guān)文章

  • MySQL8.0.27安裝過程中卡在Initializing?Database中并報錯的解決

    MySQL8.0.27安裝過程中卡在Initializing?Database中并報錯的解決

    本文主要介紹了MySQL8.0.27安裝過程中卡在Initializing?Database中并報錯的解決,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • mysql修改記錄時update操作 字段=字段+字符串

    mysql修改記錄時update操作 字段=字段+字符串

    這篇文章主要介紹了mysql修改記錄時update操作 字段=字段+字符串,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 分享幾道關(guān)于MySQL索引的重點(diǎn)面試題

    分享幾道關(guān)于MySQL索引的重點(diǎn)面試題

    這篇文章主要給大家介紹了幾道關(guān)于MySQL索引的重點(diǎn)面試題,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • mysql 的replace into實(shí)例詳解

    mysql 的replace into實(shí)例詳解

    這篇文章主要介紹了mysql 的replace into實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 從零開始搭建MySQL MMM架構(gòu)

    從零開始搭建MySQL MMM架構(gòu)

    這篇文章主要介紹了從零開始搭建MySQL MMM架構(gòu),本文講解了配置MySQL Relication、新建同步數(shù)據(jù)庫需要的用戶、同步主從數(shù)據(jù)庫、安裝MMM、配置MMM、啟動MMM等問題,需要的朋友可以參考下
    2015-04-04
  • MySQL刪除表時I/O錯誤的原因分析與解決

    MySQL刪除表時I/O錯誤的原因分析與解決

    這篇文章主要給大家介紹了關(guān)于MySQL刪除表時I/O錯誤的原因分析與解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • 在MySQL字段中使用逗號分隔符的方法分享

    在MySQL字段中使用逗號分隔符的方法分享

    大多數(shù)開發(fā)者應(yīng)該都遇到過在mysql字段中存儲逗號分割字符串的經(jīng)歷,無論這些被分割的字段代表的是id還是tag,這個字段都應(yīng)該具有如下幾個共性
    2012-06-06
  • SQL?Server實(shí)現(xiàn)全文搜索查詢詳解

    SQL?Server實(shí)現(xiàn)全文搜索查詢詳解

    這篇文章介紹了SQL?Server的全文搜索功能,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • MYSQL字符串強(qiáng)轉(zhuǎn)的方法示例

    MYSQL字符串強(qiáng)轉(zhuǎn)的方法示例

    這篇文章主要給大家介紹了關(guān)于MYSQL字符串強(qiáng)轉(zhuǎn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • MySQL8.0設(shè)置redo緩存大小的實(shí)現(xiàn)

    MySQL8.0設(shè)置redo緩存大小的實(shí)現(xiàn)

    本文主要在MySQL 8.0.30及之后版本中使用innodb_redo_log_capacity參數(shù)在線更改redo緩存文件大小,下面就來介紹一下,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02

最新評論

石柱| 佳木斯市| 河北省| 浙江省| 荆州市| 珲春市| 揭阳市| 山西省| 四平市| 富川| 石首市| 连州市| 黑水县| 黑水县| 楚雄市| 博爱县| 金寨县| 盖州市| 嘉峪关市| 来安县| 嘉峪关市| 长顺县| 宣城市| 加查县| 鱼台县| 吐鲁番市| 宜都市| 繁峙县| 乐至县| 锦州市| 开封县| 安庆市| 富顺县| 铁力市| 南澳县| 蒙山县| 黔西县| 巴塘县| 周至县| 临夏市| 张家港市|