在本教程中,您将学习如何使用Oracle CREATE VIEW
语句在数据库中创建新视图。
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 - 通常,从定义查询的选择列表派生的视图的列名称。 但是,定义查询的列名可能包含不能用于视图定义的函数或表达式。
要解决这个问题,有两个选择:- 使用符合定义查询的SELECT子句中的命名规则的列别名。
- 为
CREATE VIEW
和AS
子句之间的视图列显式指定列别名。
-
AS defining-query - 定义的查询是一个
SELECT
语句,它定义了视图的列和行。 - WITH READ ONLY -
WITH READ ONLY
子句防止底层表通过视图进行更改。 - WITH CHECK OPTION -
WITH CHECK OPTION
子句保护视图免受对基础表的任何更改,这些更改将生成未包含在定义查询中的行。
Oracle CREATE VIEW示例
我们来看一些基于示例数据库中的表创建新视图的示例。
1. 创建一个视图的例子
请参阅示例数据库中的以下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;
执行上面查询语句,得到以下结果 -
2. 创建只读视图示例
考虑以下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;
3. 创建连接视图示例
连接视图是其定义查询包含连接(例如,内连接或左连接)的视图。 以下语句创建一个名为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
语句在数据库中创建新视图。