数据更新及操作;
在SQL语句之中,数据的操作语言(DML)由两个部门组成:查询(DQL)、更新操作(增加、修改、删除)。
范例:复制表
复制emp表--新的表名称为myemp
create table myemp as select * from emp;
select * from myemp;
select * from tab;
desc myemp;
数据增加操作指的是向数据表中添加一条新的记录,而对于数据的插入通常有两种形式:
形式一:插入一条新的数据
insert into 表名称[(列1,列2,列3)]values(值1,值2,值3);
形式二:插入子查询的返回结果
insert into 表名称[(列1,列2,列3)]子查询;
所接触到的数据主要有三种(varchar2,number,date),对于这三种数据在增加语法之中的编写要求如下:
number类型:直接编写
varchar2类型:使用""声明,例如:"hello"(clob类型也按照同样的方式进行)
date类型:可以按照已有的日期格式编写字符串,例如:"22-1月-89",
或者是使用to_date()函数将字符串变为date类型数据。如果是当前日期时间,则直接使用sysdate;
1.增加新数据
范例:向myemp数据表中增加一条新数据
insert into myemp (empno,job,hiredate,ename,mgr,sal,comm,deptno)
values (8888,'CLERK',sysdate,'李四',7369,800,100,20);
范例:增加一个没有领导,没有部门、没有奖金的新雇员
insert into myemp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
values (6666,'老李','CLERK',null,to_date('2017-10-31','yyyy-mm-dd'),2000,null,null);
select * from myemp;
范例:通过子查询插入数据
insert into myemp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
select * from emp where deptno=20
insert into myemp select * from emp where deptno=10
2.数据的更新操作
数据库的更新操作有两种形式:
形式一:由用户自己指定要更新数据的内容
update 表名set 字段=值,字段=值 where 更新条件
形式而:基于子查询的更新。
update 表名 set(col,col2,..)=(select col,col2..from table where 查询条件)
范例:将SMITH雇员编号为7369的工资修改为3000元,并且每个月有500的奖金
update myemp set sal=3000,comm=500 where empno=7369;
范例:将低于公司平均薪金的雇员基本工资上涨20%
update myemp set sal=sal*1.2 where
sal<(select avg(sal) from myemp);
范例:将雇员7369的职位、基本工资、雇佣日期更新为与7839相同的信息
update myemp set (job,sal,hiredate)=
(select job,sal,hiredate from emp where empno=7839)
where empno=7369
3.数据的删除操作
当前数据表中的某些数据不再需要时,就可以通过删除语句进行删除,删除语句的语法如下:
delete from 表名 where 删除条件;
在删除数据时如果没有指定删除条件,那么就表示删除全部数据,而对于删除条件,用户也可以
直接编写子查询完成。
如果删除是没有限制删除条件,那么就表示删除全部数据。
范例:删除雇员号是7566的雇员信息
delete from myemp where empno=7566;
范例:删除30部门内的全部雇员
delete from myemp where deptno=30;
范例:删除雇员编号为7369,7566,7788的雇员信息。
delete from myemp where empno in (7369,7566,7788);
范例:删除工资最高的雇员信息;
delete from myemp where sal=(select max(sal)from myemp);
范例:删除所有雇佣日期为1987年的雇员信息
delete from myemp where to_char(hiredate,'yyyy')=1982;
4.事务处理:
事务处理在数据库开发中有着非常重要的作用,所谓的事务核心概念就是指一个session所进行的
所有更新操作,要么一起成功,也么一起失败,事务本身具有:原子性、一致性、隔离性、持久性。
以上四个特征也被称为ACID特性。
session 指的是会话,每个连接到服务器上的用户通过session表示,服务器用session区分不同
的用户。
对于每一个session而言,每一个数据库的更新操作在事务没有被提交之前都只是暂时保存在了
一段缓冲去之中,并不会真正的向数据库中发出命令,如果现在用户发现操作有问题了,则可以
进行事务的回滚。
oracle中事务操作命令:
NO
|
命令
|
描述
|
1
|
set autocommit=off
|
取消自动提交处理,开启事务处理
|
2
|
set autocommit=on
|
打开自动提交处理,关闭事务处理
|
3
|
commit
|
提交事务
|
4
|
rollback to
|
回滚操作
|
5
|
savepoint
|
设置事务保存点
|
1.执行了少量数据更新操作,在提交(commit)前,如果发现错误,可以执行回滚操作。
例如:
delete from myemp where empno=10;
rollback;
2.如果执行了一系列大量的更新操作,发现了错误,不希望全部回滚。
可以通过设置savepoint来执行回滚操作。
select * from myemp;
insert into myemp(empno,ename,hiredate,job,sal)
values(1234,'李四',sysdate,'CLERK',800);
savepoint sp1;
insert into myemp(empno,ename,hiredate,job,sal)
values(1235,'张三',sysdate,'CLERK',800);
rollback to sp1;
rollback;
5.锁
锁:实际上所谓的锁指的就是不通的session同时操作了同一资源所发生的问题。
行级锁:
用户执行了insert,update,delete,select for update 语句时,oracle将隐式的实现
记录的锁定,这种锁定被称为排他锁。
这种锁的主要特点是:当一个事务执行了相应的数据操作之后,如果此时事务没有提交,那么
会一直独占的方式锁定这些操作的数据,其他事务一直到此事务释放锁后才可以进行操作。、
表级锁:
表级锁定需要用户明确的使用‘LOCK TABLE’语句手工进行锁定
lock table 表名称|视图名称,表名称|视图名称,..in锁定模式mode[nowait]:
nowait:这是一个可选项,当视图锁定一张数据表时,如果发现已经被其他事务锁定,不会等待;
锁定模式有如下几种常见模式:
row share:行共享锁,在锁定期间允许其他事务并发对表进行各种操作,但不允许任何事务对同一张
表进行独占操作(禁止排他锁);
row exclusive:行拍它锁,允许用户进行任何操作,与行共享锁不同的是它不能防止别的事务对同一张表
进行手工锁定或独占操作;
share:共享锁,其他事务只允许执行查询操作,不能执行修改操作;
share row exclusive:共享排它锁,允许任何用户进行查询操作,但不允许其他用户使用共享锁,之前使用
的“select for update”就是共享排他锁的常见应用
exclusive:排他锁,事务将一独占的方式锁定表,其他用户允许查询,但是不能修改,也不能设置任何的锁。
范例测试锁:
第一个session
lock table MYEMP in share mode nowait;
第二个session
delete from myemp where deptno=10;
解除锁定:
解除锁定语法:
1.alter system kill session 'sid,serial#'
2.在此格式之中发现如果想要结束一个session(结束一个session 表示解锁),则需要两个标记
session id(sid),另外一个就是序列号(serial#),而这两个内容可以利用
"v$locked_object"和“V$session”两个数据字典查询得到。
范例:
创造锁
第一个session使用for update 锁定数据
select * from myemp where deptno=10 for update;
第二个session使用同样的操作。
查看锁的信息:
此处出现了一个session id(每一个用户的session由管理员分配)。但是只知道session id
还是无法解除锁定,所以还必须继续查看v$session数据字典。
select session_id,oracle_username,process from v$locked_object;
select sid,serial#,status from v$session where sid in(11,63);
kill一个进程
alter system kill session '63,321';