oracle create view语法

视图实际上是一个或多个表上的预定义查询,这些表称为基表。
视图并不存储数据,只是在查询视图时才访问基表。
视图的优点:
    ·限制用户只能通过视图检索数据,对用户屏蔽基表
    ·可以将复杂的查询编写为视图,减少用户查询的复杂度
    ·限制某个视图只能访问基表中的部分数据,提高了安全性
//
创建视图
create [or replace] [{force|noforce}] view view_name
[(alias_name[,alias_name...])]
as subquery
[with {check option|read only} constraint constraint_name]
or replace:如果视图存在就替换它。
force:即使基表不存在也要建立该视图。
noforce:若基表不存在就不建立此视图,默认值。
view_name:视图名称。
alias_name:为自查询中的表达式指定一个别名,别名个数与子查询中列数相同。
subquery:指定一个子查询,它对基表进行查询,如果已经提供别名,可以在select子句之后的列表中使用别名
with check option:表名只有子查询检索的行才能被插入、删除、更新,
                  默认情况下,在插入、删除、更新行之前并不会检查这些行是否被子查询检索。
constraint_name:指定with check option或read only约束的名称。
with read only:说明只能对基表中的行进行只读访问。
//
视图有两种基表类型
·简单视图,包含一个子查询,它只能从一个基表中检索数据
·复杂视图,包含一个子查询,有以下特点:
  ·从多个基表中检索数据
  ·使用group by或distinct子句对行进行分组
  ·包含函数调用
//
实例1:
//
测试数据:
SQL> select * from emp;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980-12-17     800.00               20
 7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
 7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
 7782 CLARK      MANAGER    7839 1981-6-9      2450.00               10
 7788 SCOTT      ANALYST    7566 1987-4-19     3000.00               20
 7839 KING       PRESIDENT       1981-11-17    5000.00               10
 7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
 7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
 7900 JAMES      CLERK      7698 1981-12-3      950.00               30
 7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
 7934 MILLER     CLERK      7782 1982-1-23     1300.00               10
//
SQL> select * from dept;
DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON
为emp表建立一个简单视图,访问emp表的属性(empno,ename,job,sal),并且sal>1200的员工
create view view_emp as
select empno,ename,job,sal
from emp
where sal>1200;
//
select * from view_emp;
EMPNO ENAME      JOB             SAL
----- ---------- --------- ---------
 7499 ALLEN      SALESMAN    1600.00
 7521 WARD       SALESMAN    1250.00
 7566 JONES      MANAGER     2975.00
 7654 MARTIN     SALESMAN    1250.00
 7698 BLAKE      MANAGER     2850.00
 7782 CLARK      MANAGER     2450.00
 7788 SCOTT      ANALYST     3000.00
 7839 KING       PRESIDENT   5000.00
 7844 TURNER     SALESMAN    1500.00
 7902 FORD       ANALYST     3000.00
 7934 MILLER     CLERK       1300.00
/*从结果可知,我们将emp表中薪水大于1200的员工的empno,ename,sal查询了出来*/
实例2:
建立一个复杂视图
create or replace view view_emp_dept as
select d.deptno,d.dname,min(e.sal) min_sal,max(e.sal) max_sal
from emp e,dept d
where e.deptno=d.deptno(+)
group by d.deptno,d.dname;
//
select * from view_emp_dept;
DEPTNO DNAME             MIN_SAL    MAX_SAL
------ -------------- ---------- ----------
    10 ACCOUNTING           1300       5000
    20 RESEARCH              800       3000
    30 SALES                 950       2850
/*正如我们所期待的,我们将scott用户下的emp表和dept表连接起来:
emp.deptno=dept.deptno(+),左外连接,
既按照emp表中的部门来查询:
部门号(deptno),部门名称(dname),部门最低薪水(min_sal),部门最高薪水(max_sal).*/
修改视图
修改视图时加上or replace即可,例如:
create view view_emp_sal as
select ename,job,deptno,sal
from emp
where sal>1000;
//
create or replace view view_emp_sal as
select ename,job,deptno,sal*12
from emp
where sal>1000;
//
编译视图
当基表改变时,建立在基表上的视图就会无效,
我们可以通过下面这条语句从数据字典中查询无效的视图:
select 'alter view'||owner||'.'||object_name||'compile;'
from dba_objects
where status='INVALID' and object_type='VIEW';
//
删除视图
drop view view_name;
//
获取视图信息
通过查看user_views视图
SQL> desc user_views;
Name             Type           Nullable Default Comments                                                   
---------------- -------------- -------- ------- ---------------------------------------------------------- 
VIEW_NAME        VARCHAR2(30)                    Name of the view                                           
TEXT_LENGTH      NUMBER         Y                Length of the view text                                    
TEXT             LONG           Y                View text                                                  
TYPE_TEXT_LENGTH NUMBER         Y                Length of the type clause of the object view               
TYPE_TEXT        VARCHAR2(4000) Y                Type clause of the object view                             
OID_TEXT_LENGTH  NUMBER         Y                Length of the WITH OBJECT OID clause of the object view    
OID_TEXT         VARCHAR2(4000) Y                WITH OBJECT OID clause of the object view                  
VIEW_TYPE_OWNER  VARCHAR2(30)   Y                Owner of the type of the view if the view is a object view 
VIEW_TYPE        VARCHAR2(30)   Y                Type of the view if the view is a object view              
SUPERVIEW_NAME   VARCHAR2(30)   Y                Name of the superview, if view is a subview                
//
SQL> select view_name,text_length,text
  2  from user_views;
VIEW_NAME                      TEXT_LENGTH TEXT
------------------------------ ----------- --------------------------------------------------------------------------------
VIEW_EMP                                52 select empno,ename,job,sal
                                           from emp
                                           where sal>1200
VIEW_EMP_DEPT                          134 select d.deptno,d.dname,min(e.sal) min_sal,max(e.sal) max_sal
                                           from emp e,dept d
//

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。 视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。 视图的优点: 1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。 2.用户通过简单的查询可以从复杂查询中得到结果。 3.维护数据的独立性,试图可从多个表检索数据。 4.对于相同的数据可产生不同的视图。 视图分为简单视图和复杂视图: 1、简单视图只从单表里获取数据,复杂视图从多表; 2、简单视图不包含函数和数据组,复杂视图包含; 3、简单视图可以实现DML操作,复杂视图不可以。 语法结构:创建视图 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] 语法解析: OR REPLACE :若所创建的试图已经存在,则替换旧视图; FORCE:不管基表是否存在ORACLE都会自动创建该视图(即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用); NOFORCE :如果基表不存在,无法创建视图,该项是默认选项(只有基表都存在ORACLE才会创建该视图)。 alias:为视图产生的列定义的别名; subquery :一条完整的SELECT语句,可以在该语句中定义别名; WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束; WITH READ ONLY :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。 案例3:基于EMP表和DEPT表创建视图 代码演示:视图 SQL> CREATE OR REPLACE VIEW EMPDETAIL 2 AS 3 SELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAME 4 FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO 5 WITH READ ONLY 6 / VIEW CREATED SQL> SELECT * FROM EMPDETAIL; ① EMPNO ENAME JOB HIREDATE DEPTNO DNAME 7369 SMITH CLERK 17-12月-80 20 RESEARCH 7499 ALLEN SALESMAN 20-2月 -81 30 SALES 7521 WARD SALESMAN 22-2月 -81 30 SALES 7566 JONES MANAGER 02-4月 -81 20 RESEARCH 7654 MARTIN SALESMAN 28-9月 -81 30 SALES 7698 BLAKE MANAGER 01-5月 -81 30 SALES 7782 CLARK MANAGER 09-6月 -81 10 ACCOUNTING 7788 SCOTT ANALYST 19-4月 -87 20 RESEARCH 7839 KING PRESIDENT 17-11月-81 10 ACCOUNTING 7844 TURNER SALESMAN 08-9月 -81 30 SALES 7876 ADAMS CLERK 23-5月 -87 20 RESEARCH 7900 JAMES CLERK 03-12月-81 30 SALES 7902 FORD ANALYST 03-12月-81 20 RESEARCH 7934
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值