SQL基础--视图
视图其实就是一条查询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基础--视图的更多相关文章
- SQL基础--> 约束(CONSTRAINT)
--============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完 ...
- [SQL基础教程] 5-1视图
[SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...
- SQL基础随记2 视图 存储过程
SQL基础随记2 视图 存储过程 View CREATE/ALTER/DROP VIEW ViewName as SELECT(...) 可以在视图的基础上继续创建视图,即,将之前创建的视图当做表 ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- 第一章 SQL基础
第一部分:SQL基础1. 为什么学习SQL自人类社会形成之日起,社会的运转就在不断地产生和使用各种信息(文献.档案.资料.数据等):在如今所谓的信息时代,由于计算机和互联网的作用,信息的产生和使用达到 ...
- 11、SQL Server 视图、数据库快照
SQL Server 视图 什么是视图? 视图是一个虚拟的表,内容源于查询的结果集.只有当视图上建立了索引后,才会具体化. 视图可以筛选和处理数据,而不是直接访问基础表.如:创建一个视图,只展示源表中 ...
- [SQL] SQL 基础知识梳理(七)- 集合运算
SQL 基础知识梳理(七)- 集合运算 目录 表的加减法 联结(以列为单位) 一.表的加减法 1.集合:记录的集合(表.视图和查询的执行结果). 2.UNION(并集):表的加法 -- DDL:创建表 ...
- (4.22)sql server视图/索引视图概念
(4.22)sql server视图 关键词:sql server视图.索引视图 SQL Server视图是由SQL语句组成的逻辑数据库对象.它也可以称为由SQL语句组成的虚拟表,该SQL语句可能包含 ...
- (2.15)Mysql之SQL基础——开发设计最佳规范
(2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...
随机推荐
- android中activity向service中传值
和activity中互相传值类似 在activity中 Intent regIntent = new Intent(this, ChatService.class); regIntent.putEx ...
- pyqt布局管理器
有时候,碰到错误: QWidget::setLayout: Attempting to set QLayout “” on MainWindow “”, which already has a lay ...
- 深入分析java中文乱码问题
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
- u-boot可ping通PC,PC不可ping通u-boot
http://blog.csdn.net/ce123_zhouwei/article/details/7339134 开发板运行U-Boot,在终端下使用Ping命令是能Ping通PC机,但PC机Pi ...
- Nhibernate 一对一,一对多,多对多 成功映射
前语: 在Nhibernate xml 的文件配置上,一对一和多对多的配置比较简单,容易出错的反而是一对多(多对一)上. 1.一对一关联关系的映射: <one-to-one name=" ...
- KafkaStream时间戳问题CreateTime = -1引起的程序中断
Exception in thread "app-8835188a-e0a0-46da-ac2a-6820ec197628-StreamThread-1" org.apache.k ...
- Linux进程同步机制
为了能够有效的控制多个进程之间的沟通过程,保证沟通过程的有序和和谐,OS必须提供一定的同步机制保证进程之间不会自说自话而是有效的协同工作.比如在共享内存的通信方式中,两个或者多个进程都要对共享的内存进 ...
- Oracle的sql语句中关键字冲突用双引号
select distinc user from instrument where created>"TO_DATE"('2015-02-05 12:00:00', 'yyy ...
- VC++使用CSocket发送HTTP Request时需要注意发送数据的编码格式
VS2010以及更高版本中新建的MFC项目字符集默认是Unicode,CString创建的字符串默认是Unicode. 使用CSocket时,若以CString组织需要发送的HTTP Head时,那么 ...
- samtools flags 的含义
对于双端比对的数据,生成的BAM文件中,R1端序列和R2端序列的标识符是一样的,之前一直不知道如何根据bam文件区分哪条序列是R1端,哪条序列是R2端,昨天仔细研究了一下,原来代表R1端和R2端的信息 ...