当前位置: 首页 > 教程 > Oracle >

Oracle视图

精华
小牛编辑
108浏览
2023-03-14

本节介绍Oracle视图,视图是Oracle数据库中的一个重要组件。

Oracle视图教程列表

按照下面的教程了解更多关于Oracle视图:

  • 创建视图 - 使用CREATE VIEW语句创建一个新的视图。
  • 删除视图 - 使用DROP VIEW语句从数据库中删除视图。
  • 可更新的视图 - 讨论如何创建可更新的视图。
  • 内联视图 - 了解如何使用内联视图来简化复杂的查询并将几个单独的查询压缩为一个查询。
  • WITH CHECK OPTION - 如何使用CREATE VIEW命令的WITH CHECK OPTION子句保护视图。

Oracle视图介绍

查询的结果是派生表,如以下示例所示:

SELECT
    name,
    credit_limit
FROM
    customers;

执行上面查询语句,得到以下结果 -

视图

派生表由包含许多行的名称和贷记限额(credit_limit)列组成。它仅包含Customers表中的部分数据。

如果给这个查询一个名字,那么就是一个视图。 这就是为什么有时将视图被称为命名查询

因此,根据定义,视图是一个“虚拟”表,其数据是存储查询的结果,每次查询视图时都会导出该查询。

视图是一个虚拟表,因为您可以在SQL查询中像使用表一样使用它。 每个视图都有数据类型的列,因此可以使用INSERT,UPDATE,DELETE和MERGE语句对视图执行查询或管理其内容(有一些限制)。

与表不同,视图不会存储任何数据。 准确地说,一个视图只是行为与表相似。 这只是一个存储在数据库中的命名查询。从视图中查询数据时,Oracle使用此存储的查询从基础表中检索数据。

假设将查询分配给名为customer_credits的名称作为一个视图,那么从该视图查询数据,如下:

SELECT
  *
FROM
  customer_credits;

在后端,Oracle查找与名称customer_credits关联的存储查询并执行以下查询:

SELECT
    *
FROM
    (
        SELECT
            name,
            credit_limit
        FROM
            customers
    );

在这个例子中,customers表被称为基表。 此外,定义视图的查询称为定义查询。

customer_credits视图返回的结果集取决于基础表(此示例中是customers表)的数据。 customer_credits视图也取决于customers表的结构。 如果重命名或删除查询引用的某个列(如namecredit_limit),则视图 - customer_credits将不再起作用。

何时使用Oracle视图

在很多情况下,可以将视图用于不同的目的。最常见的用法如下:

  • 简化数据检索。
  • 保持逻辑数据独立性。
  • 实施数据安全。

1. 简化数据检索

视图有助于显着简化数据检索。 首先,构建一个复杂的查询,仔细测试,并将查询封装在视图中。 然后,可以通过视图访问基础表的数据,而不是一遍又一遍地重写整个查询。

以下查询按年份返回客户的销售金额:

SELECT
    name AS customer,
    SUM( quantity * unit_price ) sales_amount,
    EXTRACT(
        YEAR
    FROM
        order_date
    ) YEAR
FROM
    orders
INNER JOIN order_items
        USING(order_id)
INNER JOIN customers
        USING(customer_id)
WHERE
    status = 'Shipped'
GROUP BY
    name,
    EXTRACT(
        YEAR
    FROM
        order_date
    );

执行上面查询语句,得到以下结果 -
视图

这个查询是相当复杂的。 一遍又一遍地输入是耗时的,可能会导致错误。 为了简化它,可以创建一个基于这个查询的视图:

CREATE OR REPLACE VIEW customer_sales AS 
SELECT
    name AS customer,
    SUM( quantity * unit_price ) sales_amount,
    EXTRACT(
        YEAR
    FROM
        order_date
    ) YEAR
FROM
    orders
INNER JOIN order_items
        USING(order_id)
INNER JOIN customers
        USING(customer_id)
WHERE
    status = 'Shipped'
GROUP BY
    name,
    EXTRACT(
        YEAR
    FROM
        order_date
    );

通过添加以下子句:

CREATE OR REPLACE VIEW customer_sales AS

在查询之前,您将创建customer_sales视图。 请注意,您将在下一个教程中学习如何创建视图。

现在,可以通过更简单的查询2017年获取客户的销售情况:

SELECT
    customer,
    sales_amount
FROM
    customer_sales
WHERE
    YEAR = 2017
ORDER BY
    sales_amount DESC;

执行上面查询语句,得到以下结果 -

2. 保持逻辑数据独立性

可以通过视图将基础表中的数据公开到外部应用程序。每当基表的结构发生变化时,只需要更新视图。数据库和外部应用程序之间的接口保持不变。这样的好处在于,您不必更改一行代码即可保持外部应用程序的正常运行。

例如,某些报告系统可能只需要客户销售数据来撰写战略报告。 因此,您可以为应用程序所有者提供customer_sales视图。

3. 实施数据安全

视图可用来实现一个额外的安全层。 它们可以帮助您隐藏底层表中的某些列和行,并仅向适当的用户显示所需的数据。

Oracle在视图上为您提供GRANTREVOKE命令,以便您可以指定用户可以针对该视图执行哪些操作。 请注意,在这种情况下,不会授予对基础表的任何权限,因为可能不希望用户绕过视图来直接访问基表。