五、视图、索引、序列、同义词
5.1 视图
视图可以看做是一张虚拟表,是另一种查看数据的入口。常规视图本身并不存储实际的数据,仅仅是由select语句组成的查询定义的虚拟表。
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字 段。视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
视图是建立在表、结果集或视图上的虚拟表,视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。视图提供了一 个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授 予用户直接访问底层表的权限)。从而加强了安全性,使用户只能看到视图所显示 的数据。
5.1.1 视图的特点
视图中的数据并不属于视图本身,而是属于基本的表,对视图可以像表一样进行insert,update,delete操作。
视图不能被修改,表修改后或者删除后应该删除视图再重建。
视图的数量没有限制,但是命名不能和视图以及表重复,具有唯一性。
视图可以被嵌套,一个视图中可以嵌套另一个视图
5.1.2 视图的功能
-
简化用户操作
-
能以不同的角度观察同一个数据库
-
对重构数据库提供了逻辑独立性
利用视图将需要的数据合并或者筛选,但是不能影响原表的数据和结构
-
对机密数据提供安全保护
可以建立不同的视图对不同的用户,以达到安全的目的
-
提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。
5.1.3 创建视图
视图就是封装了一条复杂查询的语句。
结构:
create [or replace] [force] view view_name
as subquery
[with check option]
[with read only]
or replace :若所创建的试图已经存在,ORACLE 自动重建该视图;
force :不管基表是否存在 ORACLE 都会自动创建该视图;
subquery :一条完整的 SELECT 语句,可以在该语句中定义别名;
with check option :插入或修改的数据行必须满足视图定义的约束;
with read only :该视图上不能进行任何 DML 操作。
举例:
语法1:create view 视图名称 as 子查询
举例:
建立一个视图,包括20部门的全部员工信息
create view empvd20 as select * from emp t where t.deptno = 20;
语法2:create or replace view 视图名称 as 子查询
如果视图已经存在,使用语法2来创建视图,这样已有的视图就会被覆盖
create or replace view empvd20 as select * from emp t where t.deptno = 20;
设置视图为只读
语法3:create or replace view 视图名称 as 子查询 with read only;
create or replace view empvd20 as select * from emp t where t.deptno = 20 with read only;
5.2 索引
5.2.1 索引的特点
索引是用于加速数据存储的数据对象,合理的使用索引可以大大降低i/0次数,从而提高数据访问性能。
索引的使用原则:
- 在大表上建立索引才有意义
- 在where子句后面或者是连接条件上的字段建立索引
- 表中数据修改频率高时不建议建立索引
5.2.2 创建索引
创建索引的语法:
-
单列索引
单列索引是基于单个列所建立的索引(添加unique代表是唯一索引,这个列的值是不会重复的)
create [unique] index 索引名 on 表名(列名)
-
复合索引
复合索引是基于两个列或多个列的索引。在同一张表上可以有多个索引,但是要求列的组合必须不同
create index emp_idx1 on emp(ename,job);
create index emp_idx1 on emp(job,ename);
举例:
给student表的sname建立索引
create index sname_index on student(sname);
给student表创建一个sname和sbirthday的索引
create index sname_sbirthday_index on student(sname,sbirthday);
5.3 序列
在很多数据库中都存在一个自动增长的列,如果想要在oracle中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。
语法:CREATE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n] //开始的值,递增默认是minvalue,递减是maxvalue
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
[{CYCLE|NOCYCLE}] //循环/不循环
[{CACHE n|NOCACHE}]; //分配并存入到内存中
范例:创建一个 seqsid 的序列,验证自动增长的操作
create sequence seqsid;
序列创建完成之后,所有的自动增长应该由用户自己处理,所以在序列中提供了以下的两种操作:
nextval :取得序列的下一个内容
currval :取得序列的当前内容
select seqsid.nextval from dual;
select seqsid.currval from dual;
在插入数据时需要自增的主键中可以这样使用:
insert into student
values(seqsid.nextval,'李四',null,"郑州");
**注:**在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值。
修改和删除列
使用alter sequence 语句修改序列,不能更改序列的start with 参数。
alter sequence 序列名称 maxvalue 5000 cycle;
删除序列
drop sequence 序列名称;
在实际项目中每一张表会配一个序列,但表和序列没有必然的联系,一个序列被哪一张表使用都可以,但一般都是一张表使用一个序列,且序列的管理一般使用工具来管理。
5.4 同义词
同义词实质上是指定方案对象的一个别名。通过屏蔽对象的名称和所有者以及对分布式数据库的远程对象提供位置透明性,同义词可以提供一定程度的安全性。同时,同义词的易用性较好,降低了数据库用户的SQL语句复杂度。
同义词允许基对象重命名或者移动,这时只需对同义词进行重定义,基于同义词的应用程序可以继续运行而无需修改。同义词本身不涉及安全,当赋予一个同义词对象权限时,实质上实在给同义词的基对象赋予权限,同义词只是基对象的一个别名。
创建与使用同义词
语法:
create [public] synonym synooym for object;
synooym表示要创建的同义词的名称,object表示表,视图,序列等要创建同义词的对象的名称。
举例:
1.私有同义词
为表T_OWNERS创建(私有)同义词,名称为OWNERS
create synonym OWNERS for T_OWNERS;
使用同义词
select * from OWNERS;
1.共有同义词
为表T_OWNERS创建(共有)同义词,名称为OWNERS2
create public synonym OWNERS2 for T_OWNERS;
以另外的用户登录,也可以使用公有同义词
select * from OWNERS2;
六、用户及权限
6.1 创建用户
create user user1
identified by password
default tablesapce space;
identified by 后边是用户的密码
defaulr tablespace 后边是表空间的名称
oracle数据库与其他数据库产品的区别在于,表和其他的数据库对象都是储存在用户下的。
6.2 用户赋予权限
新创建的用户没有任何权限。
oracle中已存在三个重要的角色:connect角色,resource角色,dba角色。
connect角色:——是授予最终用户的典型权利,最基本的
alter session——修改会话
create cluster——建立聚簇
create database link——建立数据库连接
create sequence——建立序列
create session——建立会话
create synoym——建立同义词
create view——建立视图
resource角色:——是授予开发人员的
create cluster——建立聚簇
create procedure——建立过程
create sequence——建立序列
create table——建表
create trigger——建立触发器
create type——建立类型
dba角色:拥有全部特权,是系统最高权限,只有dba才可以创建数据库结构,并且系统权限也需要dba授出,且dba用户可以操作全体用户的任意基表,包括删除。
grant dba to user1