视图其实就是一条查询SQL语句,用于显示一个或多个表或其它视图中相关数据。

创建视图:

  CREATE [OR REPLACE] [FORCE |NOFORCE ]VIEW view_name [alias [,alias]...]
  AS subquery
  [WITH CHECK OPTION]
  [WITH READ ONLY]

  OR REPLACE 如果视图存在,重建、修改这个视图
  FORCE 不管引用的表是否存在,都创建这个视图
  NOFORCE 只有当表存在的时候,才能创建这个视图(默认方式)
  WITH CHECK OPTION 只有子查询能够检索出的行才能够被插入,修改,或删除。默认情况下对此不作检查
  没有指定约束名,系统会自动为约束命名,形式为SYS_Cn。
  WITH READ ONLY 只读,不可对视图做DML操作

需要注意的是,在子查询中不能包含ORDER BY ,子查询可以是复杂的SELECT语句

修改视图

使用CREATE OR REPLACE VIEW 子句修改视图

删除视图:

DROP VIEW view_name

视图中使用DML的规定:

当视图定义中含有以下元素之一不能使用INSERT

组函数

GROUP BY、ORDER BY

DISTINCT

ROWNUM

列的定义为表达式

表中非空的列,在视图定义中未包括

视图定义含有以下元素不能使用UPDATE

组函数

GROUP BY、ORDER BY

DISTINCT

ROWNUM

列的定义为表达式

视图包含以下元素不能DELETE

组函数

GROUP BY、ORDER BY

DISTINCT

ROWNUM

与视图有关的数据字典:

DBA_VIEWS

USER_VIEWS

--演示创建视图

SQL>  create or replace view v_test as select empno,ename,hiredate,sal from emp where sal<1000;

如果提示权限不足需要赋权:grant create view to scott;

--查询刚创建的视图

SQL> select * from v_test;

     EMPNO ENAME      HIREDATE            SAL
---------- ---------- -------------- ----------
7369 SMITH 17-12月-80 800
7900 JAMES 03-12月-81 950

--在基于单表的视图上执行DML操作

SQL> insert into v_test(empno,ename,hiredate,sal) values(6688,'Keven',to_date('','YYYY-MM-DD'),850);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from v_test;

     EMPNO ENAME      HIREDATE            SAL
---------- ---------- -------------- ----------
7369 SMITH 17-12月-80 800
7900 JAMES 03-12月-81 950
6688 Keven 01-1月 -17 850 SQL> select * from emp where empno=6688; ###可以看出基表被直接修改 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
6688 Keven 01-1月 -17 850 SQL> delete from v_test where empno=6688; 已删除 1 行。 SQL> commit; 提交完成。 SQL> select * from v_test; EMPNO ENAME HIREDATE SAL
---------- ---------- -------------- ----------
7369 SMITH 17-12月-80 800
7900 JAMES 03-12月-81 950 SQL> select * from emp where empno=6688; 未选定行

--基于多表的复杂视图的DML操作

SQL> create or replace view v_test2 as select e.ename,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno and d.deptno=20;   

视图已创建。

SQL> select * from v_test2;

ENAME           DEPTNO DNAME
---------- ---------- --------------
SMITH 20 RESEARCH
JONES 20 RESEARCH
SCOTT 20 RESEARCH
ADAMS 20 RESEARCH
FORD 20 RESEARCH SQL> insert into v_test2(ename,deptno,dname) values('Stone',20,'RESEARCH'); ##不能进行更新和插入的操作
insert into v_test2(ename,deptno,dname) values('Stone',20,'RESEARCH')
*
第 1 行出现错误:
ORA-01776: 无法通过联接视图修改多个基表 SQL> delete from v_test2 where deptno=20; 已删除5行。 SQL> select * from emp where deptno=20; ###emp中对应的数据被删除了 未选定行 SQL> select * from dept; ##dept中的数据并没有被删除 DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

总结:基于多表的复杂视图在修改时无法正常完成,如果希望同时更新多张表的数据记录,可以采用替代触发器来完成;删除操作可以正常执行,但是会修改基表的数据。

--使用with check option

  --使用WITH CHECK OPTION 子句确保DML只能在特定的范围内执行,任何违反

--WITH CHECK OPTION 约束的请求都会失败

SQL> create or replace view v_test as select empno,ename,sal from emp where sal<1000 with check option;

视图已创建。

SQL> insert into v_test(empno,ename,sal) values(6688,'Keven',1650);
insert into v_test(empno,ename,sal) values(6688,'Keven',1650)
*
第 1 行出现错误:
ORA-01402: 视图 WITH CHECK OPTION where 子句违规 ##--不满足条件sal < 1000 不可插入

--WITH READ ONLY 屏蔽DML 操作

--可以使用WITH READ ONLY 选项屏蔽对视图的DML操作

--任何DML 操作都会返回一个Oracle server 错误

SQL> create or replace view v_test as select empno,ename,sal from emp where sal<1000 with read only;

视图已创建。

SQL> insert into v_test(empno,ename,sal) values(6688,'Keven',1650);
insert into v_test(empno,ename,sal) values(6688,'Keven',1650)
*
第 1 行出现错误:
ORA-42399: 无法对只读视图执行 DML 操作

--查询与视图有关的数据字典

user_views
SQL> select view_name,text from user_views;

VIEW_NAME               TEXT
------------------------------ --------------------------------------------------------------------------------
V_TEST select empno,ename,sal from emp where sal<1000 with read only
V_TEST2 select e.ename,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno
tab
SQL> select * from tab where tabtype='VIEW';

TNAME                   TABTYPE    CLUSTERID
------------------------------ ------- ----------
V_TEST2 VIEW
V_TEST VIEW
 

SQL基础--视图的更多相关文章

  1. SQL基础--&gt; 约束(CONSTRAINT)

    --============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完 ...

  2. [SQL基础教程] 5-1视图

    [SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...

  3. SQL基础随记2 视图 存储过程

    SQL基础随记2 视图 存储过程   View CREATE/ALTER/DROP VIEW ViewName as SELECT(...) 可以在视图的基础上继续创建视图,即,将之前创建的视图当做表 ...

  4. [SQL] SQL 基础知识梳理(五) - 复杂查询

    SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...

  5. 第一章 SQL基础

    第一部分:SQL基础1. 为什么学习SQL自人类社会形成之日起,社会的运转就在不断地产生和使用各种信息(文献.档案.资料.数据等):在如今所谓的信息时代,由于计算机和互联网的作用,信息的产生和使用达到 ...

  6. 11、SQL Server 视图、数据库快照

    SQL Server 视图 什么是视图? 视图是一个虚拟的表,内容源于查询的结果集.只有当视图上建立了索引后,才会具体化. 视图可以筛选和处理数据,而不是直接访问基础表.如:创建一个视图,只展示源表中 ...

  7. [SQL] SQL 基础知识梳理(七)- 集合运算

    SQL 基础知识梳理(七)- 集合运算 目录 表的加减法 联结(以列为单位) 一.表的加减法 1.集合:记录的集合(表.视图和查询的执行结果). 2.UNION(并集):表的加法 -- DDL:创建表 ...

  8. (4.22)sql server视图/索引视图概念

    (4.22)sql server视图 关键词:sql server视图.索引视图 SQL Server视图是由SQL语句组成的逻辑数据库对象.它也可以称为由SQL语句组成的虚拟表,该SQL语句可能包含 ...

  9. (2.15)Mysql之SQL基础——开发设计最佳规范

    (2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...

随机推荐

  1. samba实现跨平台文件共享

    前言:Linux/Unix主机之间实现文件共享我们可以使用NFS,那么,Linux/Unix和Windows主机之间共享文件怎么实现呢,samba就是解决这个问题的. Windows网上邻居依赖的协议 ...

  2. sqlserver 多排序的问题

    sql 执行默认执行排序的第一个字段,如果结果集中含有重复的列的字段,才会按照2...N个字段进行排序,没有重复列多排序无效果

  3. JAVA-JAVA、JavaScript、JavaWeb的关系

    相关资料:1.http://www.cnblogs.com/youring2/archive/2013/06/06/3120645.html2.https://jingyan.baidu.com/ar ...

  4. Structs hibernate spring=ssh简介

    Structs  hibernate  spring Struts Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的. Struts框架可分为以下四 ...

  5. 基于jQuery悬停弹出遮罩显示按钮代码

    今天给大家分享一款基于jQuery悬停弹出遮罩显示按钮代码.这是是一款当鼠标悬停在图片上后,会出现一系列的按钮,文字等弹性动画效果.效果图如下: 在线预览   源码下载 实现的代码. html代码: ...

  6. 使用HttpWebRequest调用wcf一段代码

    public class HttpClass { internal static HttpWebRequest _httpWebRequest; public static void Request( ...

  7. Bit operator: Left shift and Right shift (Signed or unsigned? )

    No matter left shift or right shift, the result's sign should always be the same as its left operand ...

  8. 轻量级ORM框架Dapper应用二:使用Dapper实现CURD操作

    在上一篇文章中,讲解了如何安装Dapper,这篇文章中将会讲解如何使用Dapper使用CURD操作. 例子中使用到的实体类定义如下: using System; using System.Collec ...

  9. W/MessageQueue: Handler (android.os.Handler) {4241f8f8} sending message to a Handler on a dead thread

    缩略信息是: sending message to a Handler on a dead thread 我是用IntentService时报的 稍微纤细一点儿的信息是: Handler (andro ...

  10. C/C++预处理指令

    预处理指令 Preprocessor Directives define undef ifdef ifndef if endif else and elif line error include 预定 ...