`UPDATE FROM` 的语法以及常见的更新操作方式

简介: `UPDATE FROM` 的语法以及常见的更新操作方式

在 SQL Server 中,更新(Update)操作可以结合使用 `FROM` 子句来从其他表或子查询中获取数据进行更新。这种方式通常用于复杂的更新逻辑,例如基于关联表的更新或者使用子查询筛选需要更新的行。下面我会详细介绍 `UPDATE FROM` 的语法以及常见的更新操作方式。

 

### UPDATE FROM 语法

 

基本的 `UPDATE FROM` 语法结构如下:

 

```sql
UPDATE target_table
SET target_table.column_name = source_table.expression
FROM target_table
JOIN source_table ON target_table.key_column = source_table.key_column
WHERE condition;
```

 

其中:

 

- `target_table` 是要更新的目标表。

- `source_table` 是包含要用于更新的数据的源表或者子查询结果。

- `target_table.column_name` 是目标表中要更新的列。

- `source_table.expression` 是从源表或子查询中选择的表达式或列。

- `JOIN` 条件定义了如何将目标表的行与源表的行关联。

- `WHERE` 子句用于筛选要更新的行。

 

### 示例和常见更新操作方式

 

#### 1. 基本更新

```sql

-- 将员工表中所有姓为 'Smith' 的员工的薪水提高 10%

UPDATE Employees
SET Salary = Salary * 1.1
WHERE LastName = 'Smith';
```

#### 2. 使用子查询进行更新

```sql

-- 根据另一个表的查询结果更新目标表

UPDATE Employees
SET Salary = Salary * 1.05
FROM Employees e
JOIN Sales s ON e.EmployeeID = s.EmployeeID
WHERE s.Amount > 10000;
```

 

上述示例中,`Sales` 表中的销售金额超过 10000 的员工,其薪水将会提高 5%。

 

#### 3. 使用多个表更新

 

```sql

-- 根据多个表的数据更新目标表

UPDATE Orders
SET Orders.Status = 'Completed'
FROM Orders o
JOIN OrderDetails od ON o.OrderID = od.OrderID
JOIN Products p ON od.ProductID = p.ProductID
WHERE p.Category = 'Electronics';
```

这个例子中,当产品类别为 'Electronics' 的订单通过关联表连接更新其状态为 'Completed'。

 

#### 4. 使用子查询进行条件更新

 

```sql

-- 使用子查询进行条件更新

UPDATE Employees
SET VacationHours = 0
FROM Employees e
WHERE e.EmployeeID IN (SELECT EmployeeID FROM Managers);
```

 

在这里,所有在 `Managers` 表中出现的员工的年假小时数被设置为 0。

 

### 注意事项

 

- **谨慎使用更新操作:** 更新操作可能会对数据库性能产生重大影响,特别是在大型表中,应该谨慎使用。

- **备份数据:** 在执行重要的更新操作之前,请确保已经备份了数据,以防止意外情况发生。

- **事务管理:** 对于复杂的更新操作,考虑使用事务来确保数据的一致性和完整性。

 

综上所述,`UPDATE FROM` 提供了一种强大的方式来在 SQL Server 中执行复杂的更新操作,通过结合 `JOIN` 和 `WHERE` 子句,可以根据需要从多个表或子查询中选择和更新数据。

目录
相关文章
|
5月前
|
关系型数据库 MySQL 数据库
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
101 0
|
6月前
|
关系型数据库 MySQL 测试技术
当update修改数据与原数据相同时会再次执行吗
当update修改数据与原数据相同时会再次执行吗
50 1
|
SQL 关系型数据库 MySQL
使用tkmapper避免更新on update字段
使用tkmapper避免更新on update字段
167 0
|
SQL 数据库管理
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
本篇文章讲解的主要内容是:***你有没有经历过一个update把其他列数据清空了、使用merge更新合并记录、删除违反参照完整性的记录、给你五种删除重复数据的写法*** 【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
|
SQL 关系型数据库 MySQL
十一、操作delete或者update语句,加个limit或者循环分批次删除
十一、操作delete或者update语句,加个limit或者循环分批次删除
315 0
|
前端开发
Ember Data 之记录操作:创建、更新和删除
前面在《Ember.js 项目开发之 Ember Data》介绍了Ember Data 和 《Ember Data 之模型定义》、《Ember Data 之记录查询》,本文将继续介绍记录操作:创建、更新和删除。
142 0
|
SQL 存储 缓存
执行update语句,用没用到索引,区别大吗?
我们都知道,当执行 select 查询语句时,用没用到索引区别是很大的,若没用到索引,一条 select 语句可能执行好几秒或更久,若使用到索引则可能瞬间完成。那么当执行 update 语句时,用没用到索引有什么区别呢,执行时间相差大吗?本篇文章我们一起来探究下。
417 0