详解SQL数据更新功能
数据更新
- 一、插入数据(INSERT)
 - 1. 插入单个元组
 - 语法:
 - 示例:
 
- 2. 插入多个元组
 - 语法:
 - 示例:
 
- 3. 插入子查询的结果
 - 语法:
 - 示例:
 
- 二、修改数据(UPDATE)
 - 1. 修改单个元组
 - 语法:
 - 示例:
 
- 2. 修改多个元组
 - 语法:
 - 示例:
 
- 3. 带子查询的修改
 - 语法:
 - 示例:
 
- 三、删除数据(DELETE)
 - 1. 删除单个元组
 - 语法:
 - 示例:
 
- 2. 删除多个元组
 - 语法:
 - 示例:
 
- 3. 带子查询的删除
 - 语法:
 - 示例:
 
- 四、注意事项
 - 五、综合示例
 - 初始数据视图
 - `employees` 表:
 - `temp_employees` 表:
 
- 操作 1:插入数据
 - SQL:
 - 过程分析:
 - 数据视图:
 
- 操作 2:更新数据
 - SQL:
 - 过程分析:
 - 数据视图:
 
- 操作 3:删除数据
 - SQL:
 - 过程分析:
 - 数据视图:
 
- 总结
 
一、插入数据(INSERT)
插入数据是向表中新增记录的操作。主要分为:
- 插入单个元组;
 - 插入多个元组;
 - 插入子查询的结果。
 
1. 插入单个元组
语法:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
 
示例:
INSERT INTO employees (id, name, department, salary)
VALUES (101, 'Alice', 'HR', 5000);
 
- 作用: 将一条数据插入到 
employees表中。 - 注意: 
  
- 列名和值的顺序必须一一对应;
 - 列值必须与列的 数据类型 匹配。
 
 
2. 插入多个元组
语法:
INSERT INTO table_name (column1, column2, ...)
VALUES 
(value1_1, value1_2, ...),
(value2_1, value2_2, ...),
...;
 
示例:
INSERT INTO employees (id, name, department, salary)
VALUES
(102, 'Bob', 'IT', 6000),
(103, 'Charlie', 'Finance', 7000),
(104, 'Diana', 'Marketing', 6500);
 
- 作用: 一次插入多条记录,减少单独执行的开销。
 - 注意: 数据库对一次插入的记录数可能有大小限制。
 
3. 插入子查询的结果
语法:
INSERT INTO table_name (column1, column2, ...)
SELECT column1, column2, ...
FROM another_table
WHERE condition;
 
示例:
INSERT INTO employees (id, name, department, salary)
SELECT id, name, 'Sales', salary * 1.1
FROM temp_employees
WHERE department = 'Marketing';
 
- 作用: 将 
temp_employees表中Marketing部门的员工信息插入到employees表中,同时增加工资的 10%,并将部门改为Sales。 - 注意: 
  
- 子查询的列数和数据类型必须与目标表一致;
 - 子查询可以对数据进行加工(如 
salary * 1.1)。 
 
二、修改数据(UPDATE)
修改数据是对表中的记录进行更新操作。主要分为:
- 修改单个元组;
 - 修改多个元组;
 - 带子查询的修改。
 
1. 修改单个元组
语法:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
 
示例:
UPDATE employees
SET salary = 5500
WHERE id = 101;
 
- 作用: 更新 
id = 101的员工工资为 5500。 - 注意: 
  
- 必须加上 
WHERE条件,否则会更新整张表; - 如果没有符合 
WHERE条件的记录,更新语句不会产生任何影响。 
 - 必须加上 
 
2. 修改多个元组
语法:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
 
示例:
UPDATE employees
SET salary = salary * 1.1
WHERE department = 'Sales';
 
- 作用: 将 
Sales部门所有员工的工资增加 10%。 - 注意: 
  
- 支持对多条记录同时更新;
 WHERE条件控制了更新的范围。
 
3. 带子查询的修改
语法:
UPDATE table_name
SET column1 = (SELECT value FROM another_table WHERE condition)
WHERE condition;
 
示例:
UPDATE employees
SET salary = (SELECT MAX(salary) FROM employees WHERE department = 'HR')
WHERE department = 'Sales';
 
- 作用: 将 
Sales部门所有员工的工资更新为HR部门的最高工资。 - 注意: 
  
- 子查询返回的结果必须是单值;
 - 如果子查询无结果,会将列值设置为 
NULL。 
 
三、删除数据(DELETE)
删除数据是从表中移除记录的操作。主要分为:
- 删除单个元组;
 - 删除多个元组;
 - 带子查询的删除。
 
1. 删除单个元组
语法:
DELETE FROM table_name
WHERE condition;
 
示例:
DELETE FROM employees
WHERE id = 101;
 
- 作用: 删除 
id = 101的员工记录。 - 注意: 
  
- 必须加上 
WHERE条件,否则会删除整张表; - 数据一旦删除无法恢复,除非有备份。
 
 - 必须加上 
 
2. 删除多个元组
语法:
DELETE FROM table_name
WHERE condition;
 
示例:
DELETE FROM employees
WHERE department = 'Sales';
 
- 作用: 删除 
Sales部门的所有员工记录。 - 注意: 
  
WHERE条件控制删除范围;- 如果没有满足条件的记录,则不会删除任何数据。
 
 
3. 带子查询的删除
语法:
DELETE FROM table_name
WHERE column1 IN (SELECT column1 FROM another_table WHERE condition);
 
示例:
DELETE FROM employees
WHERE id IN (SELECT id FROM temp_employees WHERE status = 'Inactive');
 
- 作用: 删除 
employees表中,所有id在temp_employees表且状态为Inactive的记录。 - 注意: 
  
- 子查询用于动态确定要删除的记录;
 - 如果子查询返回空集,不会删除任何数据。
 
 
四、注意事项
- 操作前备份数据: 特别是 
UPDATE和DELETE,防止误操作; - WHERE 条件: 
  
- 插入时不要重复插入相同的记录;
 - 修改或删除时,确保 
WHERE条件准确; 
 - 事务(Transaction)管理: 
  
- 在批量执行更新或删除时,建议使用事务管理,确保数据一致性;
 - 示例:
BEGIN TRANSACTION; DELETE FROM employees WHERE department = 'Sales'; ROLLBACK; -- 如果操作有误 COMMIT; -- 确认操作 
 - 子查询: 
  
- 子查询是动态生成数据的关键,可以灵活地插入、更新或删除;
 - 子查询结果必须符合数据的类型和数量要求。
 
 
五、综合示例
我们假设有一个表 employees 和一个临时表 temp_employees。
初始数据视图
employees 表:
 
| id | name | department | salary | 
|---|---|---|---|
| 101 | Alice | HR | 5000 | 
| 102 | Bob | IT | 6000 | 
| 103 | Charlie | Finance | 7000 | 
| 104 | Diana | Marketing | 6500 | 
temp_employees 表:
 
| id | name | department | salary | status | 
|---|---|---|---|---|
| 201 | Eva | IT | 7000 | Active | 
| 202 | Frank | IT | 8000 | Active | 
| 203 | Grace | Finance | 7500 | Inactive | 
| 204 | Helen | Sales | 5000 | Inactive | 
操作 1:插入数据
SQL:
INSERT INTO employees (id, name, department, salary)
SELECT id, name, department, salary + 1000
FROM temp_employees
WHERE department = 'IT';
 
过程分析:
- 从 
temp_employees表中筛选department = 'IT'的记录; - 将 
salary增加 1000 后插入到employees表。 
数据视图:
employees 表(插入后):
| id | name | department | salary | 
|---|---|---|---|
| 101 | Alice | HR | 5000 | 
| 102 | Bob | IT | 6000 | 
| 103 | Charlie | Finance | 7000 | 
| 104 | Diana | Marketing | 6500 | 
| 201 | Eva | IT | 8000 | 
| 202 | Frank | IT | 9000 | 
temp_employees 表(无变化):
| id | name | department | salary | status | 
|---|---|---|---|---|
| 201 | Eva | IT | 7000 | Active | 
| 202 | Frank | IT | 8000 | Active | 
| 203 | Grace | Finance | 7500 | Inactive | 
| 204 | Helen | Sales | 5000 | Inactive | 
操作 2:更新数据
SQL:
UPDATE employees
SET salary = salary * 1.15
WHERE department = 'Finance';
 
过程分析:
- 筛选出 
department = 'Finance'的记录; - 将这些记录的 
salary增加 15%。 
数据视图:
employees 表(更新后):
| id | name | department | salary | 
|---|---|---|---|
| 101 | Alice | HR | 5000 | 
| 102 | Bob | IT | 6000 | 
| 103 | Charlie | Finance | 8050 | 
| 104 | Diana | Marketing | 6500 | 
| 201 | Eva | IT | 8000 | 
| 202 | Frank | IT | 9000 | 
操作 3:删除数据
SQL:
DELETE FROM employees
WHERE id IN (SELECT id FROM temp_employees WHERE status = 'Inactive');
 
过程分析:
- 使用子查询从 
temp_employees表中筛选status = 'Inactive'的id(203 和 204); - 删除 
employees表中对应的id记录。 
数据视图:
employees 表(删除后):
| id | name | department | salary | 
|---|---|---|---|
| 101 | Alice | HR | 5000 | 
| 102 | Bob | IT | 6000 | 
| 103 | Charlie | Finance | 8050 | 
| 104 | Diana | Marketing | 6500 | 
| 201 | Eva | IT | 8000 | 
| 202 | Frank | IT | 9000 | 
temp_employees 表(无变化):
| id | name | department | salary | status | 
|---|---|---|---|---|
| 201 | Eva | IT | 7000 | Active | 
| 202 | Frank | IT | 8000 | Active | 
| 203 | Grace | Finance | 7500 | Inactive | 
| 204 | Helen | Sales | 5000 | Inactive | 
总结
-  
插入操作:
- 将 
temp_employees表中department = 'IT'的记录以加工后的形式(工资增加 1000)插入到employees表; - 插入后,
employees表新增两条记录。 
 - 将 
 -  
更新操作:
- 将 
employees表中Finance部门的工资增加 15%; - 更新后,
id = 103的工资从 7000 增加到了 8050。 
 - 将 
 -  
删除操作:
- 删除了 
temp_employees表中status = 'Inactive'的记录对应的id在employees表的记录; - 删除操作后,
employees表保持了现有的符合条件的记录。 
 - 删除了 
 
