Oracle入门第五天(上)——数据库对象之视图

一、概述

  1.什么是视图(VIEW)

    视图 从表中抽出的逻辑上相关的数据集合(是一张虚表)。

  2.为什么使用视图

    1.控制访问

    2.简化查询

  3.视图的分类

    Oracle入门第五天(上)——数据库对象之视图

二、视图管理

  1.创建视图

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];

  示例:

  Oracle入门第五天(上)——数据库对象之视图

  这里出现个小插曲,我们根据之前的管理控制台的学习,给当前用户SCOTT添加创建VIEW的权限!

  以DBA的权限进入:(无需输入用户名密码)

  Oracle入门第五天(上)——数据库对象之视图

  进入之后按照之前的操作流程增加权限——应用即可!

  可以通过子查询的列别名给视图指定列名!

  2.修改视图

  通过增加 OR REPLACE进行修改(实际上是替换了)

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;

  其他诸如设置视图只读等,可以通过视图创建处的语法进行操作!

  3.视图限制

  Oracle入门第五天(上)——数据库对象之视图

  Oracle入门第五天(上)——数据库对象之视图

  Oracle入门第五天(上)——数据库对象之视图

  当然,以上都可以通过 WITH READ ONLY进行只读限制,限制DML操作

  4.删除视图

DROP VIEW viewname

三、TOP-N分析

  1.什么是TOP-N(基本上有些类似MySQL的limit了)

    Top-N 分析查询一个列中最大或最小的 n 个值:

    最大和最小的值的集合是 Top-N 分析所关心的

  2.语法

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

  注意: 对 ROWNUM(称之为伪列) 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据。

  示例

  直接按照伪列(返回结果的行号,就是这个伪列了!)进行排序得到如下结果(注意WHERE 和 ORDER BY的顺序):

SELECT rownum,employee_id,last_name,salary
FROM employees
WHERE ROWNUM <= 10
ORDER BY salary DESC ROWNUM EMPLOYEE_ID LAST_NAME SALARY
---------- ----------- ------------------------- ----------
1 100 King 24000.00
2 101 Kochhar 17000.00
3 102 De Haan 17000.00
9 108 Greenberg 12000.00
4 103 Hunold 9000.00
10 109 Faviet 9000.00
5 104 Ernst 6000.00
6 105 Austin 4800.00
7 106 Pataballa 4800.00
8 107 Lorentz 4200.00 10 rows selected

  发现这个ROWNUM默认是按照employee_id来进行排序的!也就是把employee_id的前10个id进行了输出!

  我们进行修改,把排序好的表作为一个子表:

SELECT rownum,employee_id,last_name,salary
FROM(
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC)
WHERE ROWNUM <= 10 ROWNUM EMPLOYEE_ID LAST_NAME SALARY
---------- ----------- ------------------------- ----------
1 100 King 24000.00
2 101 Kochhar 17000.00
3 102 De Haan 17000.00
4 145 Russell 14000.00
5 146 Partners 13500.00
6 201 Hartstein 13000.00
7 108 Greenberg 12000.00
8 147 Errazuriz 12000.00
9 205 Higgins 12000.00
10 168 Ozer 11500.00 10 rows selected

  更多的一个应用是用于分页上:  

SELECT *
FROM(
SELECT ROWNUM RN,A.*
FROM(
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC) A ) B
WHERE B.RN >= 20 AND B.RN <=30

  这样,借助一个别名RN就摆脱了ROWNUM写法的控制,当然,也有另外一种写法:

SELECT *
FROM (SELECT ROWNUM RN, A.*
FROM (SELECT * FROM BPM_PROCVAR ORDER BY VARID) A
WHERE ROWNUM <= 40) B
WHERE B.RN >= 21;

  关于两种分页写法的详细探讨,参考https://www.cnblogs.com/ileaves/p/6393762.html

上一篇:实现A-Z滑动检索菜单


下一篇:Yii2高级模板vendor和application非同级目录部署