1.首先我们说说视图的作用:
都是视图。
可以隐藏表中的某些行,大公司用于隐藏一些关键信息很重要。
可以禁止用户访问基表,只能通过视图来访问。
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;
查询结果如下:
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;