本節介紹Oracle檢視,檢視是Oracle資料庫中的一個重要元件。
按照下面的教學了解更多關於Oracle檢視:
CREATE VIEW
命令的WITH CHECK OPTION
子句保護檢視。查詢的結果是派生表,如以下範例所示:
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
表的結構。 如果重新命名或刪除查詢參照的某個列(如name
或credit_limit
),則檢視 - customer_credits
將不再起作用。
在很多情況下,可以將檢視用於不同的目的。最常見的用法如下:
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在檢視上為您提供GRANT
和REVOKE
命令,以便您可以指定使用者可以針對該檢視執行哪些操作。 請注意,在這種情況下,不會授予對基礎表的任何許可權,因為可能不希望使用者繞過檢視來直接存取基表。