1 事务
事务的任务便是使数据库从一种状态变换成为另一种状态,这不同于文件系统,它是数据库所特用的。
所有的数据库中,事务只针对DML(增删改),不针对select
select只能查看其他事务提交或回滚的数据,不能查看别的事务中正在进行的操作
1.1 事务的特性
- 原子性(Atomicity)
语句级原子性,过程级原子性,事务级原子性
- 一致性(Consistency)
状态一致,同一事务中不会有两种状态
- 隔离性(Isolation)
事务间是互相分离的互不影响
- 持久性(Durability)
事务提交了,那么状态就是永久的
1.2 开启事务
- 执行任意的DML语句,会自动开启事务
--语句级:锁定语句所影响的记录行
update dept set loc = 'beijing' where deptno=10;
- 创建回滚点
--过程级
savepoint a
- 锁定整张表
select * from 表名 for update
1.3 事务语句
commit=commit work:提交事务.将本次事务中的DML操作全部持久化,并结束本次事务
rollback=rollback work:回滚事务.将本次事务中的DML操作全部取消,并结束本次事务
savepoint:手动开启事务,并创建回滚点
rollback to savepoint:回滚到指定的回滚点前,滚点之后创建的回滚点与DML操作无效
1.4 事务锁
当执行事务操作时,Oracle会在被作用的表上加锁,防止其他用户改表。
Oracle保证读一致性,并且永远都不会脏读(即读其他事务的未提交数据)。
--此时其它会话无法修改改行记录
update dept set loc = 'beijing' where deptno=10;
1.5 提交事务
使用commit语句可以提交事务,当执行了commit语句后,会确认事务的变化,结束事务,删除保存点,释放锁。
当使用commit语句结束事务之后,其他会话将可以查看到事务变化后的新数据。
savepoint a;
update dept set loc = 'beijing' where deptno=10;
--提交事务之后,回滚点被自动删除
commit;
1.6 回退事务
保存点是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。
update dept set loc = 'beijing' where deptno=10;
savepoint a;
update dept set loc = 'beijing' where deptno=20;
savepoint b;
update dept set loc = 'beijing' where deptno=30;
--回滚后,回滚点a之后执行的语句全部无效,包括回滚点b的创建
rollback to a;
--回滚全部事务,未提交的事务操作全部失效
rollback;
1.7 注意
在ORACLE中没有提供开始事务处理语句,所有的事务都是隐式开始的。也就是说ORACLE中用户不可以显式使用命令来开始一个事务。
ORACLE任务第一条修改数据库的语句,或者一些要求事务处理的场合都是事务隐式的开始。
但是当用户想要处理一个事务结束时,必须使用commit和rollback语句结束。
2 序列
2.1 sequence
ORACLE中,主键不支持自动增长,管理起来较为麻烦,通常使用序列( sequence )进行主键的管理。
sequence就是一组连续数字的集合:
每个数字只能使用一次
sequence使用前必须初始化
2.2 序列的创建
- 语法:
create sequence 序列名minvalue 1 --sequence的最小值maxvalue 10000 --sequence的最大值start with 1 --sequence的起始值increment by 1 --sequence的步进值cache 20 --缓存数字个数
;
2.3 常用方法
-
nextval:选取sequence的下一个值
也用来进行sequence的初始化,每调用1次,向前进步1
select 序列名.nextval from dual;
- currval:选取sequence的当前值
select 序列名.currval from dual;
2.4 示例
- 创建表
create table test1(id number(5) primary key,name varchar2(5)
);
- 创建序列
create sequence test1_seqminvalue 1maxvalue 10000start with 1increment by 1
;
- 初始化
select test1_seq.nextval from dual;
- 插入数据
insert into test1 values(test1_seq.currval,'aa');--1号
insert into test1 values(test1_seq.nextval,'bb');--2号
insert into test1 values(test1_seq.nextval,'cc');--3号
commit;
insert into test1 values(test1_seq.nextval,'ee');--4号
insert into test1 values(test1_seq.nextval,'ff');--5号
rollback;
--每个序号只能使用一次,不会回退
insert into test1 values(test1_seq.nextval,'dd');--6号
insert into test1 values(test1_seq.nextval,'ee');--7号
insert into test1 values(test1_seq.nextval,'ff');--8号
3 视图
3.1 概述
视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改(特指简单视图)。
视图是存储在数据字典里的一条select语句。
视图基于的表称为基表。
- 视图的特点
视图可以当成表使用
内容由基表的内容来确定
必须有DBA权限才能创建视图
- 视图的优点
将复杂的sql语句保存在数据库中,方便管理与调用
可以将一张表通过不同的视图,从逻辑上当成N张表使用
可以像对普通表赋对象权限一样,将对象权限交于某个用户
3.2 视图的分类
- 简单视图
从单表中获取数据
可以实现增删改操作,去影响基表的数据
- 复杂视图
从多表获取数据,包含函数、分组
不允许通过修改视图去影响基表的数据
3.3 视图的创建
创建视图必须拥有DBA权限
- 语法:
create [or replace] [force|noforce] view 视图名 [alias,alias...]
as
subquery
[with check option [contraint constraint]]
[with read only]
or replace:若所创建的试图已经存在,ORACLE自动重建该视图
force:不管基表是否存在ORACLE都会自动创建该视图
noforce:只有基表都存在ORACLE才会创建该视图
alias:为视图产生的列定义的别名
subquery:一条完整的SELECT语句,可以在该语句中定义别名
with check option:插入或修改的数据行必须满足视图定义的约束
with read only:该视图上不能进行任何DML操作
3.3.1 简单视图的创建
--查询名字中含有A的员工信息
create view emp_A_in_name
as
select * from emp where ename like '%A%';
--视图的使用与普通表相同
--视图本身没有数据,数据来源于视图基于的表(基表)
select * from emp_A_in_name;
select * from emp_A_in_name where deptno=30;
--通过修改视图,修改基表的数据
update emp_A_in_name set sal=3000 where empno=7900;
3.3.2 复杂视图的创建
--查询各部门的人数、平均/最低/最高薪资、薪资综合
create view emp_dept_sal
as
select deptno,count(*) num,avg(sal) avg_sal,min(sal) min_sal,max(sal) max_sal,sum(sal) sum_sal
from emp group by deptno;
3.4 视图修改
create view dept_view
as
select deptno,dname,loc from dept;
create or replace view dept_view(部门号,部门名,地址)
as
select deptno,dname,loc from dept;
create view dept_view
as
select deptno "部门号",dname "部门名",loc "工作地点"
from dept;
3.5 视图删除
drop view dept_view;
4 索引
提高查询效率,但是DML操作效率下降,不适合用在经常更改的表中
索引可以有N个,但是列组合必须不一样
4.1 索引的使用原则
- 建立在WHERE子句经常引用的表列上
- 多表查询应该在连接列上建立索引
- 不要在小表上建立索引
- 在经常需要排序操作的列上建立索引,可以加快数据排序的速度
- 索引越多,DML操作的速度越慢,尤其会极大影响INSERT操作和DELETE操作的速度
4.2 索引的分类
- 按照索引数据的存储方式:B树索引、反向索引、位图索引。
- 按照索引列的个数:单列索引、复合(组合)索引。
- 按照索引列值的惟一性:惟一索引、非惟一索。
4.3 索引的创建
- 语法:create index 索引名 on 表名 (列名1,…,列名N);
4.3.1 单列索引
单列索引是基于单个列所建立的
create index emp_index on emp(job)
4.3.2 复合索引
复合索引是基于多个列所建立的
create index newemp_idx _2 on newemp (sal,comm);
可以使用函数或模糊查询创建索引
create index my_emp_index_ename on emp('%ename%')
4.3.3 B树索引
--在建立索引时,留下30%的空间 用作后续插入的预留
create index ind_ename on emp (ename) pctfree 30 tablespace my_file;
4.3.4 唯一索引
create unique index idx_test_uid on test_uid(name);
4.3.5 位图索引
针对于具有大量重复值的列
create bitmap index sex_bitmap_index on student(sex);