SQL 数据插入学习笔记
数据插入是 SQL 中用于向表中添加新记录的操作。SQL 提供了多种数据插入方式,包括单行插入、批量插入、子查询插入、INSERT ALL
和 INSERT FIRST
。
1. 数据插入的类型
(1)单行插入
单行插入用于向表中插入一条记录。
语法:
1
| INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
|
示例:
1 2 3 4 5 6
| INSERT INTO A (empno, ename, hiredate, deptno) VALUES (1, '小强', TO_DATE('1993-07-01', 'yyyy-mm-dd'), 10);
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, ...) SELECT 列1, 列2, ... FROM 源表 WHERE 条件;
|
示例:
1 2 3 4 5 6
| INSERT INTO A SELECT * FROM tmp_emp WHERE deptno = 10;
INSERT INTO A (empno, ename, deptno) SELECT empno, ename, deptno FROM tmp_emp WHERE deptno = 20;
|
(3)子查询插入
子查询插入用于将子查询的结果插入到表中。
语法:
1 2
| INSERT INTO 表名 (列1, 列2, ...) SELECT 列1, 列2, ... FROM 源表 WHERE 条件;
|
示例:
1 2 3 4 5 6 7
| 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 INTO 表1 VALUES (列1, 列2, ...) INTO 表2 VALUES (列1, 列2, ...) SELECT 列1, 列2, ... FROM 源表;
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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;
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 INTO 表1 VALUES (列1, 列2, ...) WHEN 条件2 THEN INTO 表2 VALUES (列1, 列2, ...) ELSE INTO 表3 VALUES (列1, 列2, ...) SELECT 列1, 列2, ... FROM 源表;
|
示例:
1 2 3 4 5 6 7 8 9
| 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;
|
注意:
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
| 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. 总结
- 单行插入:向表中插入一条记录。
- 批量插入:将多条记录一次性插入表中。
- 子查询插入:将子查询的结果插入到表中。
INSERT ALL
:将一条记录插入到多个表中。
INSERT FIRST
:将满足条件的记录插入到第一个匹配的表中。