关于insert语句,相信大多数程序开发人员都比较熟悉,在平时开发过程中用的最多的可能就是单表单条插入、单表多条插入的用法,使用多表多条插入的用法则用的比较少,今天我们就一起看下:
第一种:单表单条插入
“insert into” 这种用法向单表中插入1条记录,这是Insert语句最基本的用法,无论使用JAVA还是PHP或者其他程序语言,在代码开发过程中,这种是用最多的一种用法。
SQL> insert into bonus (ename, job, sal, comm) values ('SMITH', 'CLERK', 800.00, null);
1 row inserted
SQL>
第二种:单表多条插入:
“insert into select” 这种用法在BI项目,数据集成的ETL过程中用的比较多。最典型的应用场景就是,从另外一个A表里查询,将数据插入到B表里,在插入数据的同时进行数据处理,例如如从员工表EMP中取出员工工资数据,再将工资增加10%,插入到员工工资表BONUS中,实现了数据处理过程。
SQL> insert into bonus (ename, job, sal, comm)
2 select ename, job, sal * 1.1 , comm
3 from emp ;
14 rows inserted
SQL>
第三种:多表多条插入:
“insert into all ”这种方式可以实现根据不同的条件,将数据插入到不同的表中。具体看下面测试步骤:
首先,创建3个表 SMALL_SAL、MEDIUM_SAL、LARGE_SAL,三个表中的字段相同,都是EMPNO,ENAME,SAL 这三个字段 。
SQL> create table SMALL_SAL as select EMPNO,ENAME,SAL from emp where 1=2 ;
Table created
SQL> create table MEDIUM_SAL as select EMPNO,ENAME,SAL from emp where 1=2 ;
Table created
SQL> create table LARGE_SAL as select EMPNO,ENAME,SAL from emp where 1=2 ;
Table created
SQL>
然后,再验证下SQL查询出来的数据:
SQL> select empno,ename,sum(sal+ nvl(comm,0)) as sal
2 from emp
3 group by empno,ename
4 ;
EMPNO ENAME SAL
----- ---------- ----------
7521 WARD 1750
7566 JONES 2975
7844 TURNER 1500
7876 ADAMS 1100
7499 ALLEN 1900
7369 SMITH 800
7782 CLARK 2450
7839 KING 5000
7698 BLAKE 2850
7900 JAMES 950
7902 FORD 3000
7788 SCOTT 3000
7654 MARTIN 2650
7934 MILLER 1300
14 rows selected
SQL>
第三,执行insert into all 语句 ,根据计算工资+奖金的总额,并按照工资总额的大小区间分别插入到3个表中:
SQL> insert all
2 when sal < 1000 then into small_sal
3 when sal >= 1000 and sal < 3000 then into medium_sal
4 else into LARGE_SAL
5 select empno,ename,sum(sal+ nvl(comm,0)) as sal
6 from emp
7 group by empno,ename
8 ;
14 rows inserted
SQL> commit;
Commit complete
SQL>
第四,验证下SMALL_SAL、MEDIUM_SAL、LARGE_SAL三个表的数据:
SQL> select * from SMALL_SAL order by sal ;
EMPNO ENAME SAL
----- ---------- ---------
7369 SMITH 800.00
7900 JAMES 950.00
SQL> select * from MEDIUM_SAL order by sal ;
EMPNO ENAME SAL
----- ---------- ---------
7876 ADAMS 1100.00
7934 MILLER 1300.00
7844 TURNER 1500.00
7521 WARD 1750.00
7499 ALLEN 1900.00
7782 CLARK 2450.00
7654 MARTIN 2650.00
7698 BLAKE 2850.00
7566 JONES 2975.00
9 rows selected
SQL> select * from LARGE_SAL order by sal ;
EMPNO ENAME SAL
----- ---------- ---------
7902 FORD 3000.00
7788 SCOTT 3000.00
7839 KING 5000.00
SQL>
经过验证,结果符合我们当初期望,将不同工资总额区间的数据插入到了不同的表。
最后,现在有一个问题: 如果我们在insert into all 语句中,不使用 when then条件会出现什么结果呢? 即语句写成:
insert all
into small_sal
into medium_sal
into LARGE_SAL
select empno,ename,sum(sal+ nvl(comm,0)) as sal
from emp
group by empno,ename;
没错,这个语句会将select 语句查询的结果分别无条件插入三个表中,即三个表的数据是一样的。有兴趣的朋友可以试试。