视图(学习笔记)

视图

视图是从一个或几个实体表(或视图)导出的表。它与实体表不同,视图本身是一个不包含任何真实数据的虚拟表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的实体表中。所以实体表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,通过它可以看到数据库中自己感兴趣的数据及其变化。

视图的优点:

  • 视图能够简化用户的操作;
  • 视图使用户能以多种角度看待同一数据;
  • 视图对重构数据库提供了一定程度的逻辑独立性;
  • 视图能够对机密数据提供安全保护;
  • 适当的利用视图可以更清晰的表达查询;

创建视图语法

CREATE [FORCE | NOFORCE] [OR REPLACE] VIEW 视图名称 [(别名1,别名2,...)]

AS

子查询 ;

语法参数:在创建视图中的主要参数解释如下:

FORCE:表示要创建视图的表不存在也可以创建视图;

NOFORCE:(默认)表示要创建视图的表必须存在,否则无法创建;

OR REPLACE:表示视图的替换,如果创建的视图不存在则创建新的,如果视图已经存在,则将其进行替换。

授权创建视图的权限

GRANT CREATE VIEW TO tests;

简单视图:

示例一、创建一张基本工资大于2000的视图

CREATE VIEW v_empview
AS
SELECT * FROM emp WHERE sal>2000;

查询视图是否创建成功

SELECT * FROM tab WHERE tabtype=‘VIEW‘;

查询v_empview视图

SELECT * FROM v_empview;

查询视图的具体信息

SELECT view_name,text_length,text FROM User_Views;

示例二、创建一张只包含20部门员工信息的视图

CREATE OR REPLACE VIEW v_emp20
AS
SELECT * FROM emp WHERE deptno=20;
--查询是否创建成功
SELECT * FROM tab WHERE tabtype=‘VIEW‘;
--查询myemponly_dept20视图
SELECT * FROM v_myemponly_dept20;

在视图下执行DML操作

示例三、

创建一张只包含20部门员工信息的视图,并增加一条信息

CREATE OR REPLACE VIEW v_emp20
AS
SELECT empno,ename,job,sal,deptno FROM emp WHERE deptno=20;
--查询v_myview视图
SELECT * FROM v_emp20;
--向v_emp20视图中增加一条数据
INSERT INTO v_emp20(EMPNO,ENAME,JOB,sal,deptno)VALUES(8888,‘JAVA‘,‘CLERK‘,1000,20);
COMMIT;
--查询v_myview视图
SELECT * FROM v_emp20;
--结果增加成功

示例四、对视图执行修改操作

UPDATE v_emp20 SET ename=‘ORACLE‘,job=‘MANAGER‘,sal=2000 WHERE empno=8888;
COMMIT;
--查询v_myview视图
SELECT * FROM v_emp20;

示例五、删除v_emp20视图中的数据

DELETE FROM v_emp20 WHERE empno=8888;
COMMIT;
--查询v_myview视图
SELECT * FROM v_emp20;

复杂视图

包含多个表的映射的视图

示例六、显示每个部门的详细信息

CREATE OR REPLACE VIEW v_myview
AS
SELECT d.deptno,d.dname,d.loc,
COUNT(e.empno) COUNT,NVL(ROUND(AVG(sal),2),0) AVG, NVL(SUM(sal),0) SUM,
NVL(MAX(sal),0) MAX ,NVL(MIN(sal),0) MIN
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno
GROUP BY d.deptno,d.dname,d.loc
--查询v_myview视图
SELECT * FROM v_myview;

示例七、为视图中的查询的列起别名

CREATE OR REPLACE VIEW v_myview
(部门编号,部门名称,部门位置,人数,平均工资,总工资,最高工资,最低工资)
AS
SELECT d.deptno,d.dname,d.loc,
COUNT(e.empno) COUNT,NVL(ROUND(AVG(sal),2),0) AVG, NVL(SUM(sal),0) SUM,
NVL(MAX(sal),0) MAX ,NVL(MIN(sal),0) MIN
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno
GROUP BY d.deptno,d.dname,d.loc
--查询v_myview视图
SELECT * FROM v_myview;

对于简单视图,可以直接执行INSERT,UPDATE和DELETE操作
但是对于复杂视图,不允许直接执行INSERT,UPDATE和DELETE操作。当视图符合以下任何一种情况时,都不允许直接执行DML操作。具体情况如下:
1)具有集合操作符(UNION,UNION ALL,INTERSECT,MINUS);
2)具有分组函数(MIN,MAX,SUM,AVG,COUNT等);
3)具有GROUP BY,CONNECT BY或START WITH等子句;
4)具有DISTINCT关键字;
5)具有连接查询;
为了在具有以上情况的复杂视图上执行DML操作需要征用触发器来完成

WITH CHECK OPTION 子句----保证视图的创建条件不被更改

在创建视图的时候有时候需要使用一些WHERE子句做一些条件的限制,
但是默认情况下的视图创建完成之后,是可以通过视图去修改在WHERE子句之中所使用的字段内容的,
而在此时就需要通过WITH CHECK OPTION子句来保证视图的创建条件不被更新。
语法:

     

WITH CHECK OPTION子句
CREATE [FORCE | NOFORCE] [OR REPLACE] VIEW 视图名称 [(别名1,别名2,...)]
        AS
    子查询 [WITH CHECK OPTION [ CONSTRAINT 约束名称] ];

示例八、创建一张只包含20部门人数的视图,添加约束,部门编号不可更改

CREATE OR REPLACE VIEW v_emp20
AS
SELECT * FROM emp WHERE deptno=20
WITH CHECK OPTION CONSTRAINT v_emp20_ck;---constraint后为可选不写也可以
--查询v_myview视图
SELECT * FROM v_emp20;

--如果现在更新数据并将部门编号更改为其它就会报错并提示违返了where条件
UPDATE v_emp20 SET deptno=40 WHERE empno=7369;

WITH READ ONLY子句--让视图中所有字段不可更新

语法:

WITH READ ONLY子句
CREATE [FORCE | NOFORCE] [OR REPLACE] VIEW 视图名称 [(别名1,别名2,...)]
        AS
    子查询 [WITH CHECK OPTION [ CONSTRAINT 约束名称] ]
    [WITH READ ONLY] ;

示例八、创建一张只包含20部门人数的视图,添加约束设置为只读

CREATE OR REPLACE VIEW v_emp20
AS
SELECT * FROM emp WHERE deptno=20
WITH READ ONLY;                                 --设置为只读属性
--查询v_myview视图
SELECT * FROM v_emp20;

--如果现在更新数据就会报错并提示违返了where条件
UPDATE v_emp20 SET ename=‘TTTT‘,comm=NULL WHERE empno=7369;

删除视图

DROP VIEW 视图名

示例九、删除v_myview视图

DROP VIEW v_myview;
--查询user_views数据字典
SELECT view_name,text_length,text,read_only FROM user_views;
时间: 2024-10-07 21:05:29

视图(学习笔记)的相关文章

转:oracle物化视图学习笔记

最近学习了一下物化视图,正好经理不在,把学习结果贴出来供大家一起研究一下吧. 先看一下物化视图的大概含义吧,感觉baidu的定义还不错 Baidu代码   物化视图,它是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,从而快速的得到结果.物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能:物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL 语句的正确性和有效性:物化视图需要占用存储空间:当基表发生变化时,物化视

15、DNS视图 学习笔记

view 视图,逻辑的DNS服务器,不一样的请求有意返回不一样的值 目标:120段解析返回120段的IP,其他解析返回130段IP 1.安装bind [[email protected] ~]# yum -y install bind 2.配置主配置文件 [[email protected] ~]# sed "/^\//d" /etc/named.conf options { directory       "/var/named"; dump-file      

表视图学习笔记

//  MainViewController.m //  UI_TableView界面传值 // //  Created by dllo on 15/8/7. //  Copyright (c) 2015年 cml. All rights reserved. // #import "MainViewController.h" #import "SecondViewController.h" // 4.签订协议 @interface MainViewControlle

小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(七)Progress View视图 学习笔记

1 import UIKit 2 3 class ViewController: UIViewController{ 4 5 @IBOutlet weak var progress: UIProgressView! 6 7 let operationQueue = NSOperationQueue() 8 9 var 完成进度: Int = 0{ 10 didSet(oldValue){ 11 let 进度比 = Float(完成进度)/Float(100) 12 let 是否动画 = (old

小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(六)Picker View视图 学习笔记

想对PickerView进行操作,只能在代码中操作. 下面 ,再添加三个label组件,然后将所有组件配置到代码中(看代码),然后要实现对PickerView的操作,就要实现它的DataSource协议和他的代理,在右边组件的链接栏,Outlets有两个选项,把他们都链接到控制器上: 好,我们的数据从哪里来? 我们在代码的控制器中定义几个数组,并且手工加上协议,然后会提示ViewController没有遵守协议UIPickerViewDataSource,因为我们没有实现: 下面我们就来实现协议

小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(二)ActionSheet视图 学习笔记

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

UI学习笔记---第十天UITableView表视图编辑

UITableView表视图编辑 表视图编辑的使用场景 当我们需要手动添加或者删除某条数据到tableView中的时候,就可以使用tableView编辑.比如微信 扣扣中删除和某人的通话 当我们需要手动调整单元格的顺序时,就可以通过tableView移动,移动单元格到指定位置 代理AppDelegate.m中代码 #import "AppDelegate.h" #import "RootViewController.h" @implementation AppDel