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


    一、概述

      1.什么是视图(VIEW)

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

      2.为什么使用视图

        1.控制访问

        2.简化查询

      3.视图的分类

        

    二、视图管理

      1.创建视图

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

      示例:

      

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

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

      

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

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

      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.视图限制

      

      

      

       当然,以上都可以通过 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

  • 相关阅读:
    管道通信
    进程间的八种通信方式----共享内存是最快的 IPC 方式
    归并排序时间复杂度
    vector中的push_back函数的意思是什么
    如何实现android和服务器长连接
    android中实现service动态更新UI界面
    android中如何实现UI的实时更新---需要考虑电量和流量
    Map集合排序
    (二十一)自定义Tabbar
    (二十)首页内容详细【详细页】+ 评论 + 回复
  • 原文地址:https://www.cnblogs.com/jiangbei/p/8214935.html
Copyright © 2020-2023  润新知