--dml 数据操作和tcl事务操作 --一、insert insert into emp(empno, ename, job, sal) values(1001,'rose', 'CLERK', 1500); --使用子查询插入多条数据 create table emp_20( empid number(4) primary key, name varchar(10), job varchar(9) ); insert into emp_20 (empid, name, job) select empno, ename, job from emp where deptno=20; --多表insert语句 查询语句只执行一次,然后把满足条件的分别插入到表中 --通过子句创建表,因为1=0==>false 所以里面没有数据 create table clerk as select * from emp where 1=0; create table salesman as select * from emp where 1=0; create table manager as select * from emp where 1=0; create table emp10 as select * from emp where 1=0; create table others as select * from emp where 1=0; --使用all执行多表插入 相当于没有break的switch语句,满足条件的就插入到表中 insert all when job=upper('clerk') then into clerk when job=upper('salesman') then into salesman when job=upper('manager') then into manager when deptno='10' then into emp10 else into others select * from emp; --清除表数据 truncate table clerk; truncate table salesman; truncate table manager; truncate table emp10; truncate table others; -- 使用first执行多表插入,相当于带了break的switch语句,如果满足了一个条件,然后就退出判断 insert first when job='CLERK' then into clerk when job='SALESMAN' then into salesman when job='MANAGER' then into manager when deptno='10' then into emp10 else into others select * from emp; --update update emp set sal=3500, job=lower(job) where ename ='SCOTT'; --使用带子查询的update update clerk set (mgr,sal) = (select mgr,sal from clerk where ename='JAMES') where ename='rose'; --delete delete from clerk where ename ='rose'; delete from clerk where mgr=(select empno from emp where ename='SCOTT'); --meger 数据备份 这里的update和insert和前面的语法有点不同 create table emp_bak as select * from emp; update emp set sal=1500 where ename='SCOTT'; insert into emp (empno, ename, job, sal) values(1002,'YLW','CLERK', 2500); commit; --使用on制定目标表和源表之间的关系 merge into emp_bak D using emp S on (D.empno = S.empNo) when matched then update set D.sal=S.sal when not matched then insert (D.empno, D.ename, D.job, D.sal) values(S.empno, S.ename, S.job, S.sal); --事务控制 --每次连接数据库,都会打开一个session, --每次执行的dml操作都是放入缓存中的,直到用户提交,别的session才看得到修改的数据 -- commit rollback --如果大型事务在尾部出错,全部回滚开销太大,可以设置savepoint --savepoint 在事务中定义一些回退的点 insert into emp(empno,ename) values(1111,'SHAGOU'); savepoint a; insert into emp(empno,ename) values(1112,'SHAGOU'); savepoint b; insert into emp(empno,ename) values(1113,'SHAGOU'); savepoint c; insert into emp(empno,ename) values(1114,'SHAGOU'); select empno, ename from emp where empno in(1111,1112,1113,1114); rollback to c; select empno, ename from emp where empno in(1111,1112,1113,1114); rollback to a ; select empno, ename from emp where empno in(1111,1112,1113,1114); --只读事务 --开启后,相当于对当前数据库进行一次快照,之后修改的数据,在此事务中无法获得 set transaction read only; select sal form emp where ename ='SCOTT'; --顺序事务 --可以执行dml的只读事务 set transaction isolation level serializable;