版本:latest

插入数据INSERT

INSERT主要用于再数据库表中插入新的数据行。

基本语法

最基本的 INSERT 语句形式如下:

SQL
INSERT INTO [schema.]table_name [(column1, column2, ..., columnN)] 
VALUES (value1, value2, ..., valueN)[, (value1, value2, ..., valueN)];
  • INSERT INTO ··· VALUES: 关键字,指示要执行插入操作。
  • table_name: 要插入数据的目标表的名称。
  • [schema.]: (可选) 指定表所属Schema。如果省略,默认为当前用户的Schema。
  • (column1, column2, ..., columnN): (可选) 指定要插入值的列的列表。SQL语句中明确指定列时可提高语句可读性和健壮性。即使表结构发生变化,只要不涉及这些指定的列,此 INSERT 语句仍然有效。列的顺序不必与表定义中的物理顺序一致,但提供的 VALUES 必须与这里的列顺序一一对应。
  • (value1, value2, ..., valueN): 提供要插入到指定列中的具体值,值的数量和顺序必须与 column_list 中指定的列相匹配。
  • [, (value1, value2, ..., valueN)]: (可选) 可以同时插入多行数据,每个值列表对应一行数据,中间用逗号分隔。

values 子句中提供的值需要注意以下格式:

  • 字符串和日期值需要用单引号 ' ' 引起来,数字值不需要引号。
  • 可以使用 NULL 关键字显式插入空值。
  • 可以使用各种数据库兼容的函数或表达式计算得出的值。

针对表 employees (id NUMBER, name VARCHAR2(50), salary NUMBER, hire_date DATE)

示例 1: 插入完整行 (指定所有列)

Sql
INSERT INTO employees (id, name, salary, hire_date) VALUES (101, 'John Doe', 50000, TO_DATE('2023-01-15', 'YYYY-MM-DD'));

示例 2: 插入部分行 (指定部分列)

Sql
INSERT INTO employees (id, name) VALUES (102, 'Jane Smith');

示例 3: 不指定列名 (按表定义顺序)

Sql
-- 必须为表中每一列提供值,顺序严格按照建表时的列顺序
INSERT INTO employees VALUES (103, 'Bob Johnson', 55000, SYSDATE);

示例 4: 同时插入多行 不指定列名 (按表定义顺序)

Sql
-- 必须为表中每一列提供值,顺序严格按照建表时的列顺序
INSERT INTO employees VALUES (103, 'Bob Johnson', 55000, SYSDATE),
                             (104, 'Alice Brown', 60000, SYSDATE),
                             (105, 'Charlie Davis', 70000, SYSDATE);

批量插入

当需要将一个查询的结果插入到另一个表中时,可以使用 INSERT ... SELECT 语句。适用于批量插入或数据迁移。

sql
INSERT INTO [schema.]target_table [(column1, column2, ..., columnN)] SELECT {subquery | (subquery)};
  • [schema.]target_table: 目标表。
  • (column1, column2, ..., columnN): (可选) 目标表中接收数据的列。
  • SELECT {subquery | (subquery)}: 提供源数据的 SELECT 查询。
  • 注意:subquery 返回的列数必须与目标列数(或目标表总列数,如果不指定列)匹配。数据类型需要兼容。

示例: 从一个表复制数据(可经过计算)到另一个表

sql
-- 假设表 temp_employees 与 employees 结构相同
INSERT INTO employees (id, name, salary, hire_date)
SELECT id, name, salary, hire_date FROM temp_employees
WHERE processed = 'Y';

INSERT INTO bonus_log (emp_id, bonus_amount, bonus_date)
SELECT id, salary * 0.1, SYSDATE
FROM employees
WHERE department_id = 10;