Insert语句(单条、多条、多表)插入数据的三种用法总结

        关于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 语句查询的结果分别无条件插入三个表中,即三个表的数据是一样的。有兴趣的朋友可以试试。

你可能感兴趣的:(Oracle,数据库开发,数据仓库)