Oracle day_02 其他数据库管理对象
视图
试图我们理解为虚表
视图是不存数据的, 它相当于封装起来的sql语句
最大优点是简化复杂的查询 和insert delete update 没有关系
创建视图
create or replace view 视图名字
as
select 语句
from 表名
where 关系
create or replace 的意思是, 如果有这个视图就覆盖他, 没有的话就创建这个视图
只读视图
create or replace view empinfoview
as
select e.empno,e.ename,e.sal,e.sal*12 annsal ,d.dname
from emp e , dept d
with read only
加上with read only 之后就变成了一个只读视图
还有一个叫做 with check option 这个的意思是, 比如
create or replace view testview
as
select * from emp where eid = 10 ;
比如我们创建testview 视图这个时候我们通过视图插入数据
insert into testview values (*****,10);
insert into testview values (*****,20 );
这个时候, 第一个会成立, 第二个就不会成立
check option 的意思是支持当前视图 ,
view 对象的引进是为了简化查询, 不建议用视图对数据进行修改, 因为会收到很多的限制
屏蔽DML操作
可是使用with read only 选项屏蔽对视图的DML操作
任何DML操作都会返回一个Oracle servlet 的错误
序列
mysql 中的auto_increment 这个自增长个和序列要实现的功能都一样
序列 ------->数组 ----------->内存
序列可以提高访问效率, 因为存在内存中
【1,2,3......20】 默认是20 如果超过了在增加
默认创建序列
create sequence sequence
increment by n 步长
start with n 数组开始值
maxvalue n | nomaxvalue 最大值, 没有最大值
minvalue n | nominvalue 最小值, 没有最小值
cycle | nocycle
cache n 默认数组长度 , nocache 数组长度为1
在序列中是有个指针的, 默认是不指向 数组的任何一个值,取出一个值他就像后面移动一个位置,要操作指针, 就要了解序列的属性
nextval 下一个值
currval 当前的值
创建序列
create sequence myseq ;
创建一个表
create table testseq (tid number , tname varchar2(20));
插入数据
insert into testseq values (myseq.nextval,'aaa');
然后我们查询数据
select * from testseq ;
结果为
TID TNAME
---------- --------------------
2 aaa
3 aaa
4 aaa
5 aaa
这个相当于auto_increment 但是比auto_increment 强大的多
序列在有序 的情况下有可能出现裂缝出现裂缝的原因是
回滚 回滚下,就数据不连续了
系统异常 序列在内存中, 如果内存停电了就没了 当前的指针就没了,
多表共用一个序列 相当于多个线程共享一个资源
索引(目录)
通过主键查询比较快, 因为主键的本质是一个索引
索引是用于加速数据存取的数据对象 ,合理的使用索引可以大大的降低i/o次数,从而提高数据访问性能
索引的工作原理和目录的工作原理差不多
oracle 中表的类型, 标准表, 索引表, 虚拟表
数据库的执行优化 ,验证用索引查询的快
想看一条语句的执行计划在执行语句的前面加上explain plan
我们看结果
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 261 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 3 | 261 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
执行结果, 我们可以看出, 这个语句耗用cpu 为6创建执行计划
explain plan for select * from emp where deptno =10 ;
执行语句
select * from table(dbms_xplan.display);
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim
e |
--------------------------------------------------------------------------------
-------
| 0 | SELECT STATEMENT | | 3 | 261 | 2 (0)| 00:
00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 3 | 261 | 2 (0)| 00:
00:01 |
|* 2 | INDEX RANGE SCAN | MYINDEX | 3 | | 1 (0)| 00:
00:01 |
--------------------------------------------------------------------------------
-------
用了索引的为5
这说明了 提高了效率 是 索引由 oracle 维护
不要什么时候建立索引?
列中数据值分布范围很广
列经常出现在where 字句或连接条件中出现
表经常被访问而且数据量很大,访问数据大概占数据的2%到4%
表经常被更新
索引可以提高查询效率是一个必要条件,但不是充分条件
oracle 中索引类型
1. B树(默认) 索引是一颗树,是一颗有规律的树,可以通过算法, 加快索引的遍历, 如果大家要想考计算机专业的研究生 ,数据结构, 树状结构,链状结构都要懂
2.位图
单行索引
单行索引一个基于单个列所建立的索引,比如
create index 索引名 on 表明 (列名)
符合索引
复合索引是基于两个列或者多个列的索引,在同一涨表上可以有多个索引,但是要球列的组合不许不同,比如
同义词
同义词, 和别名基本上没有区别
管理员授权
需要在管理员的用户下
grant 权限 to 用户 ;