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 ...
随机推荐
- Python内置的数据类型--list,tuple
1. list Python内置的一种数据类型是列表:list. list是一种有序的集合,可以随时添加和删除其中的元素. 最后一个元素的索引是len(classmates) - 1,用-1做索引,直 ...
- 风雪之隅(Laruence PHP开发组成员, Zend兼职顾问, Yaf, Yar, Yac, Opcache等项目作者、维护者.)
http://www.laruence.com/?from=inf&wvr=5&loc=infblog
- 基于java反射的javabean和map相互转换的工具类
话不多说,代码如下 package com.study; import java.lang.reflect.Field; import java.util.HashMap; import java.u ...
- C语言 · 判定字符位置
算法训练 6-3判定字符位置 时间限制:1.0s 内存限制:512.0MB 返回给定字符串s中元音字母的首次出现位置.英语元音字母只有‘a’.‘e’.‘i’.‘o’.‘u’五个. 若 ...
- [Makefile]多目录Makefile写法
最近需要写一个测试程序,这个测试程序需要集成一些功能,写在同一个文件看上去很不好,多个文件的Makefile又不是很熟,于是分享下面这篇文章 先介绍下,调试Makefile时,想知道某个变量的值,怎么 ...
- guava处理字符串与List之间,字符串与map之间的转换<转>
import static org.junit.Assert.*; import java.util.List; import java.util.Map; import org.junit.Test ...
- HTML——动画效果:左侧固定悬浮栏(图标控制)
效果: 默认时: 点击按钮时 html: <!DOCTYPE html> <html> <head> <title>智能家居</title> ...
- StarRTC , AndroidThings , 树莓派小车,公网环境,视频遥控(二)小车端
原文地址:http://blog.starrtc.com/?p=94 1 创建工程IDE:Android Studio 3.1:File>New>New Project>输入项目名& ...
- JSDoc 3 生成javascript API文档
一.javascript注释规范 我们在编写javascript文件的时候,一般会添加一些注释.例如一些文件.类.方法和属性都应该用合适的标记和类型进行注释.这里不但方便我们的阅读,也能养成一个好的习 ...
- 解析 Spring ConversionService
弄了张图,方便以后一眼能想起是怎么回事. 前提,看这里:Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(二) .