在本教學中,您將學習如何使用Oracle CREATE VIEW
語句在資料庫中建立新檢視。
要在資料庫中建立新檢視,請使用以下Oracle CREATE VIEW
語句:
CREATE [OR REPLACE] VIEW view_name [(column_aliases)] AS
defining-query
[WITH READ ONLY]
[WITH CHECK OPTION]
下面來看看各個引數的說明 -
OR REPLACE - OR REPLACE
選項取代了現有檢視的定義。如果已授予該檢視的各種許可權,則非常方便。因為當使用DROP VIEW和CREATE VIEW
來更改檢視的定義時,Oracle會刪除檢視特權,這可能不是您想要的。 為了避免這種情況,可以使用保留檢視特權的CREATE OR REPLACE
子句。
FORCE - 通常,基於現有的表建立一個新的檢視。 但是,有時可能希望根據稍後建立的表建立檢視,或者在建立檢視時沒有足夠的許可權存取表。在這些情況下,可以使用FORCE
選項。
column_aliases - 通常,從定義查詢的選擇列表派生的檢視的列名稱。 但是,定義查詢的列名可能包含不能用於檢視定義的函式或表示式。
要解決這個問題,有兩個選擇:
CREATE VIEW
和AS
子句之間的檢視列顯式指定列別名。AS defining-query - 定義的查詢是一個SELECT
語句,它定義了檢視的列和行。
WITH READ ONLY
子句防止底層表通過檢視進行更改。WITH CHECK OPTION
子句保護檢視免受對基礎表的任何更改,這些更改將生成未包含在定義查詢中的行。我們來看一些基於範例資料庫中的表建立新檢視的範例。
請參閱範例資料庫中的以下employees
表 -
以下語句根據employees
表建立一個名為employee_yos
的檢視。 該檢視顯示了員工ID,姓名和服務年限:
CREATE VIEW employee_yos AS
SELECT
employee_id,
first_name || ' ' || last_name full_name,
FLOOR( months_between( CURRENT_DATE, hire_date )/ 12 ) yos
FROM
employees;
在這個例子中,沒有定義檢視的列名,因為定義的查詢使用列別名來表達,比如full_name
列為:first_name || ' ' || last_name
和yos
列為: FLOOR( months_between( CURRENT_DATE, hire_date )/ 12 )
。
如果您不想在查詢中使用列別名,則必須在CREATE VIEW
子句中定義它們:
CREATE VIEW employee_yos (employee_id, full_name, yos) AS
SELECT
employee_id,
first_name || ' ' || last_name,
FLOOR( months_between( CURRENT_DATE, hire_date )/ 12 )
FROM
employees;
以下查詢返回服務年數為15
的員工:
SELECT
*
FROM
employee_yos
WHERE
yos = 15
ORDER BY
full_name;
執行上面查詢語句,得到以下結果 -
考慮以下customers
表,結構如下:
以下範例將建立一個名為customer_credits
的唯讀檢視,該檢視基於customers
表。 該檢視包含三列:customer_id
,name
和credit
:
CREATE OR REPLACE VIEW customer_credits(
customer_id,
name,
credit
) AS
SELECT
customer_id,
name,
credit_limit
FROM
customers WITH READ ONLY;
連線檢視是其定義查詢包含連線(例如,內連線或左連線)的檢視。 以下語句建立一個名為backlog
的檢視,其定義查詢包含連線三個表的聯接子句:orders
,order_items
和products
。三個表之間的關係如下所示 -
參考以下語句 -
CREATE OR REPLACE VIEW backlogs AS
SELECT
product_name,
EXTRACT(
YEAR
FROM
order_date
) YEAR,
SUM( quantity * unit_price ) amount
FROM
orders
INNER JOIN order_items
USING(order_id)
INNER JOIN products
USING(product_id)
WHERE
status = 'Pending'
GROUP BY
EXTRACT(
YEAR
FROM
order_date
),
product_name;
在本教學中,您已學習如何使用Oracle CREATE VIEW
語句在資料庫中建立新檢視。