视图其实就是一条查询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. Python内置的数据类型--list,tuple

    1. list Python内置的一种数据类型是列表:list. list是一种有序的集合,可以随时添加和删除其中的元素. 最后一个元素的索引是len(classmates) - 1,用-1做索引,直 ...

  2. 风雪之隅(Laruence PHP开发组成员, Zend兼职顾问, Yaf, Yar, Yac, Opcache等项目作者、维护者.)

    http://www.laruence.com/?from=inf&wvr=5&loc=infblog

  3. 基于java反射的javabean和map相互转换的工具类

    话不多说,代码如下 package com.study; import java.lang.reflect.Field; import java.util.HashMap; import java.u ...

  4. C语言 · 判定字符位置

    算法训练 6-3判定字符位置   时间限制:1.0s   内存限制:512.0MB      返回给定字符串s中元音字母的首次出现位置.英语元音字母只有‘a’.‘e’.‘i’.‘o’.‘u’五个. 若 ...

  5. [Makefile]多目录Makefile写法

    最近需要写一个测试程序,这个测试程序需要集成一些功能,写在同一个文件看上去很不好,多个文件的Makefile又不是很熟,于是分享下面这篇文章 先介绍下,调试Makefile时,想知道某个变量的值,怎么 ...

  6. guava处理字符串与List之间,字符串与map之间的转换<转>

    import static org.junit.Assert.*; import java.util.List; import java.util.Map; import org.junit.Test ...

  7. HTML——动画效果:左侧固定悬浮栏(图标控制)

    效果: 默认时: 点击按钮时 html: <!DOCTYPE html> <html> <head> <title>智能家居</title> ...

  8. StarRTC , AndroidThings , 树莓派小车,公网环境,视频遥控(二)小车端

    原文地址:http://blog.starrtc.com/?p=94 1 创建工程IDE:Android Studio 3.1:File>New>New Project>输入项目名& ...

  9. JSDoc 3 生成javascript API文档

    一.javascript注释规范 我们在编写javascript文件的时候,一般会添加一些注释.例如一些文件.类.方法和属性都应该用合适的标记和类型进行注释.这里不但方便我们的阅读,也能养成一个好的习 ...

  10. 解析 Spring ConversionService

    弄了张图,方便以后一眼能想起是怎么回事. 前提,看这里:Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(二) .