视图和同义词
一.视图:
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’的一行数据。
名称 空值 类型
----- -------- ------------
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;
查询结果如下:
二.同义词:
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;
欢迎批评指正