对表插入、更新、删除数据
一、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表。