• Oracle系列十三 视图


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

    • 视图是一种虚表。
    • 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
    • 向视图提供数据内容的语句为 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;

  • 相关阅读:
    请求的详细资料级别没有事实表
    BIEE汇总数据如何放在后面
    Biee仪表盘中提示空值如何去掉
    UFT测试本地应用程序登陆小实例(描述性编程)
    Mysql找回丢失密码
    linux下Mysql多实例实现
    如何从零安装Mysql
    Linux系统下yum源配置(Centos 6)
    Linux系统管理常用命令用法总结(2)
    Linux系统管理常用命令用法总结(1)
  • 原文地址:https://www.cnblogs.com/loaderman/p/11739125.html
Copyright © 2020-2023  润新知