oracle数据库对象-表(2)

对表插入、更新、删除数据

一、insert

insert into 表名 (字段1, 字段2, ... ,字段n) values (值1, 值2, ... ,值n);

1、写字段列表,可以只写部分字段(主键和非空),其它字段默认为空(null)。

insert into emp (empno, ename) values (99, 'APPLE');

也可以把所有字段都写出来。

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (98, 'JACK', NULL, NULL, NULL, NULL, NULL, NULL);

2、不写字段列表,值必须按照表中字段的默认顺序排列,并且必须为每个列提供一个值。

insert into emp values (100, 'TOM', 'SALESMAN', 7698, to_date('19860101000000', 'yyyymmddhh24miss'), 3000, 100, 30);

字符和日期值应放在单引号中;
数字值不应放在单引号中,因为对于指定为number数据类型的字段,如果使用了单引号,可能会发生数字值的隐式转换。

3、insert语句插入date类型数值

insert into tabname(datecol) value(sysdate) ; -- 用date值
insert into tabname(datecol) value(sysdate+1) ; -- 用date值
insert into tabname(datecol) value(to_date('2014-02-14','yyyy-mm-dd')) ; -- 用to_date
insert into tabname(datecol) value(to_date('2014-02-14 20:47:00','yyyy-mm-dd hh24:mi:ss')) ; -- 用to_date
insert into tabname(datecol) value(to_date('20140214','yyyymmdd')) ; -- 用to_date
insert into tabname(datecol) value(to_date('20140214204700','yyyymmddhh24miss')) ; -- 用to_date

二、update

update 表名 set 列1 = 值1, 列2 = 值2, 列n = 值n where 筛选条件;


update emp set deptno = 20 where ename = 'TOM';

update多个列的值,用逗号分隔。

三、delete

delete from 表名 where 筛选条件;


delete from emp where ename = 'TOM';

如果不写where条件,会把整个表的记录都删除

delete from emp;

四、merge
merge命令根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行update,无法匹配的执行insert。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于insert+update。

MERGE INTO table_name table_alias
  USING (table|view|sub_query) alias
  ON (join condition)
  WHEN MATCHED THEN
    UPDATE SET 
    col1 = col_val1,
    col2 = col2_val
  WHEN NOT MATCHED THEN
    INSERT (column_list)
    VALUES (column_values);


简单理解:

MERGE INTO 表1 table_alias
  USING (表2) alias
  ON (连接条件)
  WHEN MATCHED THEN
    UPDATE SET 
    col1 = col_val1,
    col2 = col2_val
  WHEN NOT MATCHED THEN
    INSERT (column_list)
    VALUES (column_values);


表1:目标数据
表2:源数据

先从表1、表2中找符合连接条件的记录,如果记录存在,则执行update,一般是把源数据字段赋值目标数据字段。如果记录不存在,则执行insert,一般是把源数据表记录insert到目标数据表记录。update和insert的动作是一起做的。
merge语句执行有一个方向性,表2 -> 表1。update和insert改动的对象必须是表1的字段。实际上是把两个表的数据合并到其中一个表里面。应该属于集合范畴操作吧。

表2和表1,表结构相同可以理解使用过程,但是表结构不同,该如何使用呢?
using后面可以跟多个表吗?然而并不能。

下面做个小实验:
把emp表复制一份为emp2表,在emp表插入两条数据,在emp2表插入一条数据,empno都要不同,使用merge into语句测试。

merge into emp t1
using emp2 t2
on (t1.empno = t2.empno)
when matched then
  update set t1.comm = t2.comm + 1
when not matched then
  insert (empno, ename, job) values (t2.empno, t2.ename, t2.job);


这里update的表是t1表,insert插入的表也是t1表。