Oracle的数据库对象
同意词
数据库对象的替换名称,优点:
简化SQL语句;
隐藏对象的名称和所有者;
为分布式数据库的远程对象提供了位置透明性;
提供对对象的公共访问;
//如果在scott账号下的某个权限不足的话,可以通过下面的一系列操作来
完成:
conn system/[password] as sysdba;
grant create synonym to scott;
conn scott/tiger;
创建:
create [(public)] synonym [别名] for tablename;
删除:
drop synonym [别名];
数据字典:user_synonyms;
公有同意词的意义就是所有用户都可以访问,别人访问的时候不必再用用户.表名
来访问;比如system为scott.emp创建了employee别名,scott和其他用户都可以查询
这个别名,但是如果试图删除或者做其他操作,就会发现,即使是scott表也看不见
这个别名表,因为这个别名是system的;
序列
能够自动产生连续唯一值的数据库共享对象;
序列用于为主键提供值;
创建序列语句:
//用create创建的,就可以用drop删除;
create sequence seq
[increment by n]
[start with n]
[{maxvalue n|nomaxvalue}]
[{minvalue n|nominvalue}]
[{cycle|nocycle}]
[{cache n|nocache}] //在缓冲区存储生成的值;
属性:其实是函数
nextval 返回下一个可用的值;初始化序列值;
currval 获取当前的序列值;
数据字典:user_sequences;
序列是个什么东西呢?它就是在数据库中创建的一个供其他表
插入或者操作表数据的时候的一个方便的工具而已;
视图
视图显示了表中的一部分数据;
虚拟表,不实际存在数据;
好处:
提供了另外一种级别的安全性,也就是说我不告诉用户基表是
谁,就告诉一个可以让用户查询知道的视图;
隐藏数据的复杂性;视图的列可以首先从基表处拼合一个简单的列;
将应用程序与基表定义的修改隔离开来;
从另一个角度提供数据;
创建:create or replace view ....
order by....按照特定的顺序对行进行排列;
force 选项可用于创建带有错误的视图;
//你一直苦于当有一个SQL语句打错了的时候,如果
用r,/只能重新执行,无法直接只修改错误的地方而需要
全部重打;下面就有一个非常好用的方法来解决这个问题:
执行一句sql语句;
ed;//将会把上一行的sql语句写入afiedt.buf中;
修改afiedt.buf中你认为错误的地方,保存;
在sql-plus中使用r,/,将会执行修改后的afiedt.buf
中的sql语句 ;
所有的子查询结果都可以放在视图中,这就是为什么说视图简化了
表的复杂性,简化了sql的原因;
子查询可以排序,可以xxxx,所以得到的视图也可以是被排序后的,
被xxxx后的;
Oracle没有top关键字,为了得到前几行数据,我们:
Oracle中有两个隐藏的列:
rowid,对每一个行的唯一的物理映射的标识,
如果用具体的rowid来检索,速度飞快;
rownum,一个输出序列;如果想要检索出前5条的话,
就用where rownum<=5;
举个例子:create or replace view v_sal as
select ename as 姓名,sal as 工资
from emp order by sal;
select * from v_sal where rownum<=10;
这个例子将得到工资最低的前十个人;
视图更强大的功能是联接视图;
数据字典:user_views
删除视图:drop view
比如:
>create or replace view v_union as
select * from temp union all select * from temp1;
可以创建temp,temp1两个表的联合的视图;
视图的维护:
alter view v_union compile;
为什么这么做呢?这跟视图的原理是有关的,视图是系统通过编译sql语句得到
的一个虚拟表,也就是说这个表是基于系统的一次编译后的sql语句而存在的;
如果基表改变了,但视图还是基于原来被编译的sql语句,所以我们需要用
alter view v_union compile来重新编译视图;