目录

详解SQL数据更新功能

详解SQL数据更新功能

一、插入数据(INSERT)

插入数据是向表中新增记录的操作。主要分为:

  1. 插入单个元组;
  2. 插入多个元组;
  3. 插入子查询的结果。

1. 插入单个元组

语法:

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

示例:

INSERT INTO employees (id, name, department, salary)
VALUES (101, 'Alice', 'HR', 5000);
  • 作用
    将一条数据插入到 employees 表中。
  • 注意 :
    1. 列名和值的顺序必须一一对应;
    2. 列值必须与列的 数据类型 匹配。

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
  • 注意 :
    1. 子查询的列数和数据类型必须与目标表一致;
    2. 子查询可以对数据进行加工(如 salary * 1.1 )。

二、修改数据(UPDATE)

修改数据是对表中的记录进行更新操作。主要分为:

  1. 修改单个元组;
  2. 修改多个元组;
  3. 带子查询的修改。

1. 修改单个元组

语法:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

示例:

UPDATE employees
SET salary = 5500
WHERE id = 101;
  • 作用
    更新 id = 101 的员工工资为 5500。
  • 注意 :
    1. 必须加上 WHERE 条件,否则会更新整张表;
    2. 如果没有符合 WHERE 条件的记录,更新语句不会产生任何影响。

2. 修改多个元组

语法:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

示例:

UPDATE employees
SET salary = salary * 1.1
WHERE department = 'Sales';
  • 作用
    Sales 部门所有员工的工资增加 10%。
  • 注意 :
    1. 支持对多条记录同时更新;
    2. 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 部门的最高工资。
  • 注意 :
    1. 子查询返回的结果必须是单值;
    2. 如果子查询无结果,会将列值设置为 NULL

三、删除数据(DELETE)

删除数据是从表中移除记录的操作。主要分为:

  1. 删除单个元组;
  2. 删除多个元组;
  3. 带子查询的删除。

1. 删除单个元组

语法:

DELETE FROM table_name
WHERE condition;

示例:

DELETE FROM employees
WHERE id = 101;
  • 作用
    删除 id = 101 的员工记录。
  • 注意 :
    1. 必须加上 WHERE 条件,否则会删除整张表;
    2. 数据一旦删除无法恢复,除非有备份。

2. 删除多个元组

语法:

DELETE FROM table_name
WHERE condition;

示例:

DELETE FROM employees
WHERE department = 'Sales';
  • 作用
    删除 Sales 部门的所有员工记录。
  • 注意 :
    1. WHERE 条件控制删除范围;
    2. 如果没有满足条件的记录,则不会删除任何数据。

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 表中,所有 idtemp_employees 表且状态为 Inactive 的记录。
  • 注意 :
    1. 子查询用于动态确定要删除的记录;
    2. 如果子查询返回空集,不会删除任何数据。

四、注意事项

  1. 操作前备份数据
    特别是 UPDATEDELETE ,防止误操作;
  2. WHERE 条件 :
    • 插入时不要重复插入相同的记录;
    • 修改或删除时,确保 WHERE 条件准确;
  3. 事务(Transaction)管理 :
    • 在批量执行更新或删除时,建议使用事务管理,确保数据一致性;

    • 示例:

      BEGIN TRANSACTION;
      DELETE FROM employees WHERE department = 'Sales';
      ROLLBACK; -- 如果操作有误
      COMMIT;   -- 确认操作
  4. 子查询 :
    • 子查询是动态生成数据的关键,可以灵活地插入、更新或删除;
    • 子查询结果必须符合数据的类型和数量要求。

五、综合示例

我们假设有一个表 employees 和一个临时表 temp_employees

初始数据视图

employees 表:

idnamedepartmentsalary
101AliceHR5000
102BobIT6000
103CharlieFinance7000
104DianaMarketing6500

temp_employees 表:

idnamedepartmentsalarystatus
201EvaIT7000Active
202FrankIT8000Active
203GraceFinance7500Inactive
204HelenSales5000Inactive

操作 1:插入数据

SQL:

INSERT INTO employees (id, name, department, salary)
SELECT id, name, department, salary + 1000
FROM temp_employees
WHERE department = 'IT';

过程分析:

  1. temp_employees 表中筛选 department = 'IT' 的记录;
  2. salary 增加 1000 后插入到 employees 表。

数据视图:

employees (插入后):

idnamedepartmentsalary
101AliceHR5000
102BobIT6000
103CharlieFinance7000
104DianaMarketing6500
201EvaIT8000
202FrankIT9000

temp_employees (无变化):

idnamedepartmentsalarystatus
201EvaIT7000Active
202FrankIT8000Active
203GraceFinance7500Inactive
204HelenSales5000Inactive

操作 2:更新数据

SQL:

UPDATE employees
SET salary = salary * 1.15
WHERE department = 'Finance';

过程分析:

  1. 筛选出 department = 'Finance' 的记录;
  2. 将这些记录的 salary 增加 15%。

数据视图:

employees (更新后):

idnamedepartmentsalary
101AliceHR5000
102BobIT6000
103CharlieFinance8050
104DianaMarketing6500
201EvaIT8000
202FrankIT9000

操作 3:删除数据

SQL:

DELETE FROM employees
WHERE id IN (SELECT id FROM temp_employees WHERE status = 'Inactive');

过程分析:

  1. 使用子查询从 temp_employees 表中筛选 status = 'Inactive'id (203 和 204);
  2. 删除 employees 表中对应的 id 记录。

数据视图:

employees (删除后):

idnamedepartmentsalary
101AliceHR5000
102BobIT6000
103CharlieFinance8050
104DianaMarketing6500
201EvaIT8000
202FrankIT9000

temp_employees (无变化):

idnamedepartmentsalarystatus
201EvaIT7000Active
202FrankIT8000Active
203GraceFinance7500Inactive
204HelenSales5000Inactive

总结

  1. 插入操作 :

    • temp_employees 表中 department = 'IT' 的记录以加工后的形式(工资增加 1000)插入到 employees 表;
    • 插入后, employees 表新增两条记录。
  2. 更新操作 :

    • employees 表中 Finance 部门的工资增加 15%;
    • 更新后, id = 103 的工资从 7000 增加到了 8050。
  3. 删除操作 :

    • 删除了 temp_employees 表中 status = 'Inactive' 的记录对应的 idemployees 表的记录;
    • 删除操作后, employees 表保持了现有的符合条件的记录。