转载

oracle视图

视图和同义词

一.视图:

1.首先我们说说视图的作用:

  • 视图跟查询select的作用差不多,只不过视图具有封装的作用,跟java中的类的概念有相似之处。通过创建一个视图,你可以把一些简单的,复杂的查询的sql语句存贮于它里面,所以,视图是基于一张表或多张表的。
  • 视图实际并不存贮数据,创建视图后,每次通过视图查询,程序就会在后台自己执行视图中的select语句。数据是存贮在基表中的。(基表就是创建视图时用到的表)。user_table,user_sequences,user_indexes

都是视图。

  • 好处:将复杂的查询用视图来实现,隐藏复杂的业务逻辑(很像java类中的函数)。

可以隐藏表中的某些行,大公司用于隐藏一些关键信息很重要。

可以禁止用户访问基表,只能通过视图来访问。

2.创建视图前所需要的条件。

  • 学习几天数据库之后,你就会知道,不管对数据做什么操作,首先这个用户必须要有操作的权限。所以,创建视图需要视图的权限。

查询用户的权限:

select * from user_role_privs;

看看它有没有创建视图的权限。

  • 授予用户创建视图的权限。
grant create view to scott;

给scott用户分配创建视图的权限。

3.准备工作做好之后就可以创建视图了。

  • 创建视图的语法。

CREATE [OR REPLACE] [FORCE | NOFORCE ] VIEW view_name;

[ALIAS_NAME,....(表达式)] AS SUBQUERY

[WITH CHECK OPTION | READ ONLY]

CONSTRAINT constraint_name; 

OR REPLACE:如果你已经创建了一个同名的视图,那么加上or replace的话,就会覆盖前面的视图,否则的话就出出错。

FORCE:强制创建视图,即使基表不存在也创建。

NOFORCE:如果基表不存在,则不创建视图。默认值。

view_name:视图名称。

ALIAS_NAME:子查询表达式的别名。

WITH CHECK OPTION:表示只有被查询搜索到的数据行才可以进行插入,更新,删除操作。默认是不使用该项。

constraint_name:是前面约束的名称。

WITH READ ONLY:只能读取数据,不能增删改。

  • 简单视图示例:
create view emp_view AS select * from dept where deptno<20;
  • 复杂视图示例:
create or replace view emp_dept_salgrade AS select empno,ename,sal,dname,grade from emp e  inner join dept d using(deptno) inner join salgrade s on e.sal between s.losal and s.hisal with check option constraint cname;

创建了一个以三张表为基表的多表关联视图,视图里面可以查询到的内容有emp表的empno,ename,sal和dept表的dname和salgrade表的grade(工资等级),并且是一个增删改的表。

  • 简单视图和复杂视图的区别。(简单和复杂之分是我自己的总结,不官方,理解就好。)

1.简单视图是以一张表为基表存贮sql语句的视图,而复杂视图是以多张表为基表。

2.简单视图可以通过视图来对表的数据增删改,而基于多表的复杂视图不可以。

4.利用视图。

注意:复杂视图只能查询(一般创建视图就是为了封装复杂sql查询语句,所以查询用的多,大多都是复杂视图。)简单视图可以增删改查。

  • 查询:跟通过表查询差不多。
select * from emp_dept_salgrade;

注意:如果create视图时用了check option语句,那么增删改的时候将受到select语句where的限制。例如,查询的是where 工资>3000职工的信息,那么在增删改的时候的数据的工资如果不大于3000的话,就会报错。

如果create视图时用了read only语句,那么不论是复杂视图还是简单视图的话,都不可以增删改。

  • 增加:

注意:如果通过视图往表里面增加数据时,必须符合表的约束。比如:

create or replace view e AS

select ename from emp

with check option constraint nnn;

insert into e(ename)values('5654','XU');

这个视图里面只有一个ename列,且不是主键,那么你就不能增加数据了,因为基表里面的主键是非空的,通过视图增加数据也必须符合表的结构,所以不能通过这个视图增加。故在创建视图时,尽量把一些具有非空约束的列也放在select语句中,减少增加数据时的困难度。

  • 修改:

update e set ename='xuwenshuai' where ename='KING';修改表中和视图中ename为KING->xuwenshuai

  • 删除:

delete from e where ename='xuwenshaui';通过视图删除了ename=‘xuwenshuai’的一行数据。

5.查看视图结构。 (视图包含的数据种类和数据类型和一些约束。)

DESCRIBE view_name;

示例:describe emp_dept_salgrade;

查询出来的结果如下:

名称 空值 类型

----- -------- ------------

EMPNO NOT NULL NUMBER(4)

ENAME VARCHAR2(10)

SAL NUMBER(7,2)

DNAME VARCHAR2(14)

GRADE NUMBER

6.查询视图定义的信息 (视图的名称,视图的字符长度,文本代码,约束)

select  view_name ,text_length,text from user_views;

查询结果如下:

oracle视图

二.同义词:

1.认识同义词 :同义词就是给那么比较长的对象的名称创建一个别名,比如视图的名称,我有时也会写的很长,而同义词的作用就是:1:缩短对象名字的长度;2名字缩短之后,访问的时候也比较方便。

2.准备工作 :给用户分配创建视图的权限。

grant create synonym to scott;

3.创建同义词

CREATE [PUBLIC] SYNONYM synonym_name FOR object_name ;

示例:为上面的复杂视图创建一个同义词。

create synonym eds  for emp_dept_salgrade;

注意:如果在创建同义词的时候加上了public字样的话,那么在删除的时候也要为它分配删除的权限,因为加上public的话这个同义词就是公共的。不加的话分配创建权限时会自动分配删除的权限。

4.删除同义词

DROP SYNONYM  synonmy_name;

正文到此结束
Loading...