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命令,以便您可以指定使用者可以針對該檢視執行哪些操作。 請注意,在這種情況下,不會授予對基礎表的任何許可權,因為可能不希望使用者繞過檢視來直接存取基表。