Oracle視圖

本節介紹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查詢中像使用表一樣使用它。 每個視圖都有數據類型的列,因此可以使用INSERTUPDATEDELETEMERGE語句對視圖執行查詢或管理其內容(有一些限制)。

與表不同,視圖不會存儲任何數據。 準確地說,一個視圖只是行為與表相似。 這只是一個存儲在資料庫中的命名查詢。從視圖中查詢數據時,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命令,以便您可以指定用戶可以針對該視圖執行哪些操作。 請注意,在這種情況下,不會授予對基礎表的任何許可權,因為可能不希望用戶繞過視圖來直接訪問基表。


上一篇: Oracle觸發器 下一篇:無