oracle中的视图view

版权声明:本文为博主原创,转载请附原文链接。 https://blog.csdn.net/bibibrave/article/details/82532932

一、什么是视图?

视图中是不存放数据的,它只是一个定义; 物化视图(快照)是真正存放数据的

视图以经过定制的方式显示来自一个或多个表的数据
视图可以视为“虚拟表”或“存储的查询”
创建视图所依据的表称为“基表”

二、视图的优点有:

提供了另外一种级别的表安全性
隐藏的数据的复杂性
简化的用户的SQL命令
隔离基表结构的改变
通过重命名列,从另一个角度提供数据

三、创建视图的语法:

视图的正常创建

CREATE [OR REPLACE] [FORCE] VIEW
    view_name [(alias[, alias]...)] 
  AS select_statement
  [WITH CHECK OPTION]
  [WITH READ ONLY];
  • or replace 如果视图存在则替换掉它
  • force 强制创建视图,即使基本表不存在,视图也能正常创建。如果以后一旦表建立,视图则会立马应用。
  • as 基于某张表(select from where group by order by查询语句)
  • [WITH CHECK OPTION] 使得用户不能执行减少视图结果集(记录数)的更新操作
  • [WITH READ ONLY] 表示视图只读,不能更新。

视图的更新,单表视图可以更新,视图的更新会影响到基表,但原视图有可能会查询不到。

create view view1 as select * from student where sno=1;
update view1  set sno =5 where sno=1; --把学号为1的更改为5
--此时原始表中的数据也会发生改变,但视图却已经查询不到满足条件的结果了。

使用order by子句创建视图 (与sql server不同,sqlserver只能在查询视图的时候使用order by)

create view view2 as select * from student order by sno desc;

③ 连接视图的创建

复习一下连接语法:

--相等连接(第一种写法):
  select table1.column,table2.column
  from  table1, table2 
  where  table1.column1=table2.column2
 -- 可以使用表的别名,为了书写的简化。

--相等连接(第二种写法):
  select table1.column,table2.column
  from  table1 inner join table2 
  on   table1.column1=table2.column2
 --可以使用表的别名,为了书写的简化。   

--左外连接(第一种写法):右外相反
  select table1.column,table2.column
 from  table1 left  outer  join table2
  on   table1.column1=table2.column2
  可以使用表的别名,为了书写的简化。

--左外连接(第二种写法):右外相反
 select table1.column,table2.column
  from  table1, table2 
  where  table1.column1=table2.column2(+)
  可以使用表的别名,为了书写的简化。 

--全外连接(一种写法):
  select table1.column,table2.column
 from  table1 full  outer  join table2
  on   table1.column1=table2.column2
 -- 可以使用表的别名,为了书写的简化。

     在视图上也可以使用修改数据的DML语句,如INSERT、UPDATE和DELETE

视图上的DML语句有如下限制:

  • 只能修改一个底层的基表(即单表视图
  • 如果修改违反了基表的约束条件,则无法更新视图
  • 如果视图包含连接操作符、DISTINCT 关键字、集合操作符、聚合函数或 GROUP BY 子句,则将无法更新视图
  • 如果视图包含伪列或表达式,则将无法更新视图

    复杂视图的更新update,如果复杂视图想要更新的话,只可以更新键保留表的那些列,非键保留表会随之做出更改,但我们不能主动地去更改。
ep:
有两张表学生表(学号、姓名、院系号) 系表(院系号、院系名)
当我们对上述两张表创建一个视图:

create view view_student_dept 
as 
select a.sno ,a.sname ,a deptno deptno1,
b.deptno deptno2,b.deptname 
from student a ,dept b 
where a.deptno=b.deptno;

     此时在视图中,student表的sno作为该视图的主键,而dept则没有一列作为主键,故我们称student为键保留表,dept为非键保留表

instead of 触发器可以实现对任何视图的任何更新(后续章节)

四、视图中的函数

视图中可以使用单行函数、分组函数和表达式

必须为使用函数或者表达式的字段指定名字

--例如我们将视图中的学生英文姓名全部转化为大写,方便查询
create view view4 as select sno,upper(sanme) upper_name 
from student;

使用DROP VIEW语句删除视图

drop view viewname
select * from user_views; --其中text列为创建视图语句

猜你喜欢

转载自blog.csdn.net/bibibrave/article/details/82532932
今日推荐