视图 :从表中抽出的逻辑上相关的数据集合。

  • 视图是一种虚表。
  • 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
  • 向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句.
  • 视图向用户提供基表数据的另一种表现形式

为什么使用视图

  • 控制数据访问
  • 简化查询
  • 避免重复访问相同的数据

简单视图和复杂视图

创建视图

  • 在 CREATE VIEW 语句中嵌入子查询
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
  • 子查询可以是复杂的 SELECT 语句
CREATE OR REPLACE VIEW empview AS
SELECT
employee_id emp_id,
last_name name,
department_name
FROM
employees e,
departments d
WHERE
e.department_id = d.department_id
  • 描述视图结构
DESCRIBE empvu80
  • 创建视图时在子查询中给列定义别名
CREATE VIEW salvu50 AS
SELECT
employee_id id_number,
last_name name,
salary * 12 ann_salary
FROM
employees
WHERE
department_id = 50;

注:在选择视图中的列时应使用别名

查询视图

SELECT
*
FROM
salvu50;

修改视图

  • 使用CREATE OR REPLACE VIEW 子句修改视图
  • CREATE VIEW 子句中各列的别名应和子查询中各列相对应
CREATE OR REPLACE VIEW empvu80 (
id_number,
name,
sal,
department_id
) AS
SELECT
employee_id,
first_name
|| ' '
|| last_name,
salary,
department_id
FROM
employees
WHERE
department_id = 80;

创建复杂视图

CREATE VIEW dept_sum_vu (
name,
minsal,
maxsal,
avgsal
) AS
SELECT
d.department_name,
MIN(e.salary),
MAX(e.salary),
AVG(e.salary)
FROM
employees e,
departments d
WHERE
e.department_id = d.department_id
GROUP BY
d.department_name;

视图中使用DML的规定

  • 可以在简单视图中执行 DML 操作
  • 当视图定义中包含以下元素之一时不能使用delete:
  1. 组函数
  2. GROUP BY 子句
  3. DISTINCT 关键字
  4. ROWNUM 伪列
CREATE OR REPLACE VIEW sal_view AS
SELECT
AVG(salary) avg_sal
FROM
employees
GROUP BY
department_id
  • 当视图定义中包含以下元素之一时不能使用update:
  1. 组函数
  2. GROUP BY子句
  3. DISTINCT 关键字
  4. ROWNUM 伪列
  5. 列的定义为表达式
  • 当视图定义中包含以下元素之一时不能使insert:
  1. 组函数
  2. GROUP BY 子句
  3. DISTINCT 关键字
  4. ROWNUM 伪列
  5. 列的定义为表达式
  6. 表中非空的列在视图定义中未包括

屏蔽 DML 操作

  • 可以使用 WITH READ ONLY 选项屏蔽对视图的DML 操作
  • 任何 DML 操作都会返回一个Oracle server 错误
CREATE OR REPLACE VIEW empvu10 (
employee_number,
employee_name,
job_title
) AS
SELECT
employee_id,
last_name,
job_id
FROM
employees
WHERE
department_id = 10
WITH READ ONLY;

删除视图

  • 删除视图只是删除视图的定义,并不会删除基表的数据
DROP VIEW view;
DROP VIEW empvu80;

Top-N 分析

  • Top-N 分析查询一个列中最大或最小的 n 个值:
  1. 销售量最高的十种产品是什么?
  2. 销售量最差的十种产品是什么?
  • 最大和最小的值的集合是 Top-N 分析所关心的

查询最大的几个值的 Top-N 分析:

SELECT [column_list], ROWNUM
FROM (SELECT [column_list]
FROM table
ORDER BY Top-N_column)
WHERE ROWNUM <= N;

注意: 对 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据

示例:查询工资最高的三名员工:

SELECT
ROWNUM AS rank,
last_name,
salary
FROM
(
SELECT
last_name,
salary
FROM
employees
ORDER BY
salary DESC
)
WHERE
ROWNUM <= 3;

示例

SELECT
*
FROM
(
SELECT
ROWNUM rn,
employee_id,
salary
FROM
(
SELECT
employee_id,
salary,
last_name
FROM
employees
ORDER BY
salary DESC
)
)
WHERE
rn <= 50
AND rn > 40;

Oracle系列十三 视图的更多相关文章

  1. Oracle系列之视图

    涉及到表的处理请参看原表结构与数据  Oracle建表插数据等等 创建视图,把tb_Employee表sal<1000的雇员,映射到该视图( view) create or replace vi ...

  2. .Net程序员学用Oracle系列:视图、函数、存储过程、包

    1.视图 在实际操作过程中,本人发现 Oracle 视图定义有一个缺陷,就是不大方便注释,每次写好的注释执行之后再打开视图定义所有注释就全都没了.后来我发现把注释写到末尾就不会被清除,但这样总感觉乖乖 ...

  3. .Net程序员学用Oracle系列(7):视图、函数、过程、包

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.视图 1.1.创建视图 2.函数 2.1.创建函数 2.2.调用函数 3.过程 3.1.创建过程 3.2.调用过程 4.包 ...

  4. .Net程序员学用Oracle系列(7):视图、函数、存储过程、包

    1.视图 1.1.创建.删除及调用普通视图 1.2.高级视图介绍 2.函数 2.1.系统函数介绍 2.2.创建.删除及调用自定义函数 3.存储过程 3.1.创建.修改及删除存储过程 3.2.调用存储过 ...

  5. Oracle 11g系列:视图

    视图是数据库中特有的对象,视图用于存储查询,但不会存储数据(物化视图除外).这是视图和数据表的重要区别.Oracle中有4种视图:关系视图.内嵌视图.对象视图和物化视图. 1.关系视图 1>.创 ...

  6. .Net程序员学用Oracle系列(23):视图理论、物化视图

    1.视图理论 1.1.视图的存储 1.2.视图的作用 1.3.视图的工作机制 1.4.视图的依赖性 1.5.可更新的连接视图 1.6.内联视图 2.物化视图 2.1.刷新物化视图 2.2.物化视图日志 ...

  7. .Net程序员学用Oracle系列(8):触发器、任务、序列、连接

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.触发器 1.1.创建触发器 1.2.禁用触发器 & 启用触发器 & 删除触发器 2.任务 2.1.DBMS_ ...

  8. .Net程序员学用Oracle系列(25):触发器详解

    1.触发器理论 1.1.触发器的应用场景 1.2.触发器的类型 1.3.DML 触发器的触发顺序 2.触发器实战 2.1.创建触发器 2.1.1.创建 DML 触发器 2.1.2.创建 DDL 触发器 ...

  9. .Net程序员学用Oracle系列(28):PLSQL 之SQL分类和动态SQL

    1.SQL 语句分类 1.1.分类方法及类型 1.2.数据定义语言 1.3.数据操纵语言 1.4.其它语句 2.动态 SQL 理论 2.1.动态 SQL 的用途 2.2.动态 SQL 的语法 2.3. ...

随机推荐

  1. linux设备驱动程序--sysfs用户接口的使用

    linux sysfs文件系统 本文部分内容参考自官方文档 自2.6版本开始,linux内核开始使用sysfs文件系统,它的作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持 ...

  2. WingIDE Pro 7如何检查Python集成?

    在开始使用某些代码之前,让我们确保Wing已成功找到您的Python安装.立即从“ 工具”菜单中打开Python Shell工具.如果一切顺利,它应该启动Python并向您显示Python命令提示符, ...

  3. go mod开发模式设置

    文章要解决的仅仅是一个问题 当你使用go get 无论如何get不到所需的包的问题 第一步就是下载goland 新手极其推荐goland,因为直接使用gland几乎没有挫败感,使用其他工具可能要折腾好 ...

  4. mysql显示一张表的索引

    show index from tm_show.fulfillment_order;show index from tm_show.express_verify;show index from tra ...

  5. dfs 排列组合——找所有子集(重复元素和不重复元素)

    17. 子集 中文 English 给定一个含不同整数的集合,返回其所有的子集. 样例 样例 1: 输入:[0] 输出: [ [], [0] ] 样例 2: 输入:[1,2,3] 输出: [ [3], ...

  6. 为什么要指定HashMap的容量?HashMap指定容量初始化后,底层Hash数组已经被分配内存了吗?

    为什么要指定HashMap的容量? 首先创建HashMap时,指定容量比如1024后,并不是HashMap的size不是1024,而是0,插入多少元素,size就是多少: 然后如果不指定HashMap ...

  7. Explorer(2019年牛客多校第八场E题+线段树+可撤销并查集)

    题目链接 传送门 题意 给你一张无向图,每条边\(u_i,v_i\)的权值范围为\([L_i,R_i]\),要经过这条边的条件是你的容量要在\([L_i,R_i]\),现在问你你有多少种容量使得你可以 ...

  8. “为了交项目干杯”对“那周余嘉熊掌将得队”、“男上加男,强人所男”的Beta产品测试报告

    "为了交项目干杯"对"那周余嘉熊掌将得队"."男上加男,强人所男"的Beta产品测试报告 格式描述 课程名称:软件工程1916|W(福州大学 ...

  9. dump array

    <?php //array_dump.php $a=array(); $a[]=1; $a[]=2; $a[]=3; $a[]=4; $a[]='a'; $a[]='b'; $a[]='c'; ...

  10. How do I fix "selector not recognized" runtime exceptions when trying to use category methods from a static library?

    https://developer.apple.com/library/content/qa/qa1490/_index.html A: If you're seeing a "select ...