Oracle创建视图

本教程中,您将学习如何使用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 VIEWAS子句之间的视图列显式指定列别名。
  • 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_nameyos列为: 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_idnamecredit

CREATE OR REPLACE VIEW customer_credits(
        customer_id,
        name,
        credit
    ) AS 
SELECT
        customer_id,
        name,
        credit_limit
    FROM
        customers WITH READ ONLY;

3. 创建连接视图示例

连接视图是其定义查询包含连接(例如,内连接或左连接)的视图。 以下语句创建一个名为backlog的视图,其定义查询包含连接三个表的联接子句:ordersorder_itemsproducts。三个表之间的关系如下所示 -

参考以下语句 -

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语句在数据库中创建新视图。

免责声明:
1.本站所有内容只做学习和交流使用。 版权归原作者所有。
2.保证站内提供的所有可下载源码资源(软件等)都是按“原样”提供,本站未做过任何改动;但本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。
3.本站部分内容均收集于网络!如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。请联系站长邮箱:admin#ibian.online(#换成@)处理!

给TA打赏
共{{data.count}}人
人已打赏
数据库

Oracle删除视图

2025-2-20 14:41:30

数据库

如何避免MYSQL主从延迟带来的读写问题?

2025-2-20 14:47:53

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索