濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > MySQL跨表查詢與跨表更新

MySQL跨表查詢與跨表更新

熱門標(biāo)簽:安徽ai電話電銷機(jī)器人有效果嗎 外呼系統(tǒng)電銷受騙 走過(guò)哪個(gè)省地圖標(biāo)注 巫師三血與酒地圖標(biāo)注 萊西市地圖標(biāo)注 銷售語(yǔ)音電話機(jī)器人 400電話申請(qǐng)信用卡 常州網(wǎng)絡(luò)外呼系統(tǒng)開(kāi)發(fā) 在哪里申請(qǐng)400電話

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

背景

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

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

憨B SQL 直接被秒殺

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

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

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

Mysql Update Join

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

同樣,在 MySQL 中, 我們也可以在 UPDATE 語(yǔ)句中使用 JOIN 子句執(zhí)行跨表更新,語(yǔ)法就是這樣:

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

我們還是詳細(xì)的說(shuō)明一下上面的語(yǔ)法:

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

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

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

上面的語(yǔ)法其實(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

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

我摸魚看到的,覺(jué)得是靈魂翻譯

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

Update Join 例子

年底了,又到了評(píng)績(jī)效的時(shí)候了,就是那個(gè)叫 KPI 的東東(你們有嗎),聽(tīng)說(shuō)要根據(jù) KPI 調(diào)工資了。有兩張表

第一張表「employees-員工表」

建表語(yǔ)句如下:

create table employees
(
  employee_id bigint auto_increment comment '員工ID,主鍵',
  employee_name varchar(50) null comment '員工名稱',
  performance int(4) null comment '績(jī)效分?jǐn)?shù) 1,2,3,4,5',
  salary float null comment '員工薪水',
  constraint employees_pk
    primary key (employee_id)
)
comment '員工表';

第二張表「merits-績(jī)效字典表」

建表語(yǔ)句如下:

create table merits
(
  performance int(4) null,
  percentage float null
)
comment '績(jī)效字典表';

先生成一些模擬數(shù)據(jù)

-- 績(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)前績(jī)效對(duì)應(yīng)的調(diào)薪百分比)

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

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

拱哥績(jī)效不好,沒(méi)給漲工資......

三橫一豎一咕嘎,四個(gè)小豬🐷來(lái)吃zha,咕嘎咕嘎又來(lái)倆

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

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

新員工工作干的不錯(cuò),也要 1.5% 漲點(diǎn)工資的。如果我們還是用 UPDATE INNER JOIN,按照上面的更新語(yǔ)句是不可能完成的,因?yàn)闂l件等式不成立,這是我們就要用到 UPDATE LEFT JOIN

UPDATE employees
  LEFT JOIN
  merits ON employees.performance = merits.performance
SET salary = salary + salary * 0.015
WHERE merits.percentage IS NULL;

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

您可能感興趣的文章:
  • mysql中的跨庫(kù)關(guān)聯(lián)查詢方法
  • mysql跨庫(kù)事務(wù)XA操作示例
  • MySql實(shí)現(xiàn)跨表查詢的方法詳解
  • Yii2實(shí)現(xiàn)跨mysql數(shù)據(jù)庫(kù)關(guān)聯(lián)查詢排序功能代碼
  • mysql 跨表查詢、更新、刪除示例
  • MySQL中進(jìn)行跨庫(kù)查詢的方法示例

標(biāo)簽:河北 煙臺(tái) 赤峰 果洛 陽(yáng)江 鞍山 來(lái)賓 黃石

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL跨表查詢與跨表更新》,本文關(guān)鍵詞  MySQL,跨表,查詢,與,更新,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL跨表查詢與跨表更新》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于MySQL跨表查詢與跨表更新的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    偃师市| 乌拉特中旗| 通河县| 苍溪县| 岫岩| 邳州市| 大连市| 淳化县| 鹤壁市| 手机| 浦北县| 龙海市| 吐鲁番市| 惠州市| 紫阳县| 尚义县| 县级市| 武夷山市| 兴仁县| 甘孜| 嘉义市| 元江| 宣武区| 上虞市| 应城市| 漳平市| 巴彦县| 靖江市| 海原县| 永德县| 平原县| 乳源| 高淳县| 旬邑县| 临汾市| 湛江市| 同德县| 蚌埠市| 许昌县| 华坪县| 富民县|