SQL 数据插入

SQL 数据插入学习笔记

数据插入是 SQL 中用于向表中添加新记录的操作。SQL 提供了多种数据插入方式,包括单行插入、批量插入、子查询插入、INSERT ALLINSERT FIRST

1. 数据插入的类型

(1)单行插入

单行插入用于向表中插入一条记录。

语法:
1
INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
示例:
1
2
3
4
5
6
-- 插入一条记录到表 A
INSERT INTO A (empno, ename, hiredate, deptno)
VALUES (1, '小强', TO_DATE('1993-07-01', 'yyyy-mm-dd'), 10);

-- 插入一条记录到表 A(插入所有列)
INSERT INTO A VALUES (4, '卷毛', '职员', 2, TO_DATE('1997-02-23', 'yyyy-mm-dd'), 800, 0, 10, 9, '女');

注意

  • 如果插入所有列,可以省略列名。
  • 如果插入部分列,必须指定列名。

(2)批量插入

批量插入用于将多条记录一次性插入表中。

语法:
1
2
INSERT INTO 表名 (列1, 列2, ...)
SELECT1, 列2, ... FROM 源表 WHERE 条件;
示例:
1
2
3
4
5
6
-- 将部门编号为 10 的员工插入到表 A
INSERT INTO A SELECT * FROM tmp_emp WHERE deptno = 10;

-- 将部门编号为 20 的员工的部分列插入到表 A
INSERT INTO A (empno, ename, deptno)
SELECT empno, ename, deptno FROM tmp_emp WHERE deptno = 20;

(3)子查询插入

子查询插入用于将子查询的结果插入到表中。

语法:
1
2
INSERT INTO 表名 (列1, 列2, ...)
SELECT1, 列2, ... FROM 源表 WHERE 条件;
示例:
1
2
3
4
5
6
7
-- 将部门编号为 30 的员工的部分列插入到表 A
INSERT INTO A (empno, ename, deptno)
SELECT empno, ename, deptno FROM tmp_emp WHERE deptno = 30;

-- 子查询限定条件插入
INSERT INTO (SELECT empno, ename, deptno, sal FROM A WHERE deptno = 60 WITH CHECK OPTION)
VALUES (7, '李..', 60, 1000);

注意

  • WITH CHECK OPTION 用于确保插入的数据满足子查询的条件。

(4)INSERT ALL

INSERT ALL 用于将一条记录插入到多个表中。

语法:
1
2
3
4
INSERT ALL
INTO1 VALUES (列1, 列2, ...)
INTO2 VALUES (列1, 列2, ...)
SELECT1, 列2, ... FROM 源表;
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
-- 创建两张表 A1 和 A2
CREATE TABLE A1 AS SELECT empno, ename, sal FROM tmp_emp WHERE 0 <> 0;
CREATE TABLE A2 AS SELECT ename, deptno, job FROM tmp_emp WHERE 0 <> 0;

-- 清空表数据
TRUNCATE TABLE A1;
TRUNCATE TABLE A2;

-- 将 tmp_emp 的数据插入到 A1 和 A2
INSERT ALL
INTO A1 VALUES (empno, ename, sal)
INTO A2 VALUES (ename, deptno, job)
SELECT * FROM tmp_emp;

注意

  • INSERT ALL 会将子查询的结果分别插入到多个表中。

(5)INSERT FIRST

INSERT FIRST 用于将满足条件的记录插入到第一个匹配的表中。

语法:
1
2
3
4
5
INSERT FIRST
WHEN 条件1 THEN INTO1 VALUES (列1, 列2, ...)
WHEN 条件2 THEN INTO2 VALUES (列1, 列2, ...)
ELSE INTO3 VALUES (列1, 列2, ...)
SELECT1, 列2, ... FROM 源表;
示例:
1
2
3
4
5
6
7
8
9
-- 创建表 A3
CREATE TABLE A3 AS SELECT sal, age, comm FROM tmp_emp WHERE 0 <> 0;

-- 将 tmp_emp 的数据插入到 A1、A2 或 A3
INSERT FIRST
WHEN sal > 3000 THEN INTO A1 VALUES (empno, ename, sal)
WHEN sal > 2000 THEN INTO A2 VALUES (ename, deptno, job)
ELSE INTO A3 VALUES (sal, age, comm)
SELECT * FROM tmp_emp;

注意

  • INSERT FIRST 只会将记录插入到第一个满足条件的表中。

2. 综合示例

(1)复制表结构并插入数据

1
2
3
4
5
-- 复制表结构
CREATE TABLE A AS SELECT * FROM tmp_emp WHERE 0 <> 0;

-- 插入数据
INSERT INTO A SELECT * FROM tmp_emp WHERE deptno = 10;

(2)使用 INSERT ALL 插入数据

1
2
3
4
5
6
7
8
9
-- 创建两张表
CREATE TABLE A1 AS SELECT empno, ename, sal FROM tmp_emp WHERE 0 <> 0;
CREATE TABLE A2 AS SELECT ename, deptno, job FROM tmp_emp WHERE 0 <> 0;

-- 插入数据
INSERT ALL
INTO A1 VALUES (empno, ename, sal)
INTO A2 VALUES (ename, deptno, job)
SELECT * FROM tmp_emp;

(3)使用 INSERT FIRST 插入数据

1
2
3
4
5
6
7
8
9
-- 创建表 A3
CREATE TABLE A3 AS SELECT sal, age, comm FROM tmp_emp WHERE 0 <> 0;

-- 插入数据
INSERT FIRST
WHEN sal > 3000 THEN INTO A1 VALUES (empno, ename, sal)
WHEN sal > 2000 THEN INTO A2 VALUES (ename, deptno, job)
ELSE INTO A3 VALUES (sal, age, comm)
SELECT * FROM tmp_emp;

3. 总结

  1. 单行插入:向表中插入一条记录。
  2. 批量插入:将多条记录一次性插入表中。
  3. 子查询插入:将子查询的结果插入到表中。
  4. INSERT ALL:将一条记录插入到多个表中。
  5. INSERT FIRST:将满足条件的记录插入到第一个匹配的表中。

SQL 数据插入
https://blog.pangcy.cn/2018/09/12/数据库相关/Oracle/SQL 语法/SQL 数据插入/
作者
子洋
发布于
2018年9月12日
许可协议