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 ...
随机推荐
- interactive_timeout wait_timeout
官方解释: interactive_timeout The number of seconds the server waits for activity on an i ...
- sql 判断
sql server select expertId,mail= ( CASE mail WHEN '' THEN ' ' else mail end ) from Siemens.dbo.tblEx ...
- Android实例-ImageList与Image的应用
procedure TForm1.Button1Click(Sender: TObject);var oSizeF: TSizeF;beginoSizeF.cx:=10;//发现这个值小了会增加马赛 ...
- 适配器模式和外观模式(head first设计模式——6)
为什么要把适配器模式和外观模式放在同一篇文章中,主要是其相对前面的几个模式来讲会简单些并且具有相似之处.下面就分别通过例子来看理解一下两种模式,然后再进行对其进行比较. 一.适配器模式 1.1适配器模 ...
- 【动软.Net代码生成器】连接MySQL生成C#的POCO实体类(Model)
首先是工具的下载地址: 动软.Net代码生成器 该工具官网自带完整教程: 文档:http://www.maticsoft.com/help/ 例子:http://www.maticsoft.com/h ...
- [pthread]Linux C 多线程简单示例
#include <stdio.h> #include <pthread.h> pthread_mutex_t mutex; pthread_cond_t cond; void ...
- 求链表倒数第k个节点
程序员面试题6-查找链表中倒数第k个结点 (-- ::)转载▼ 标签: 杂谈 分类: 程序设计 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下 ...
- JavaScrip——练习(做悬浮框进一步:悬浮窗后缀悬浮窗【感觉这种方法比较麻烦】)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Remote Desktop Connection没法全屏解决方案
Remote Desktop Connection无法全屏解决方案Sometimes, Remote Desktop Connection总是一个窗口,不自动全屏,任务栏不能自动隐藏起来,要拖动滚动条 ...
- StarRTC , AndroidThings , 树莓派小车,公网环境,视频遥控(二)小车端
原文地址:http://blog.starrtc.com/?p=94 1 创建工程IDE:Android Studio 3.1:File>New>New Project>输入项目名& ...