Oracle创建视图

故事扮演 提交于 2019-12-02 08:56:14

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
选项取代了现有视图的定义。如果已授予该视图的各种权限,则非常方便。因为当使用DROP VIEW和CREATE VIEW来更改视图的定义时,Oracle会删除视图特权,这可能不是您想要的。 为了避免这种情况,可以使用保留视图特权的CREATE OR REPLACE子句。
FORCE
通常,基于现有的表创建一个新的视图。 但是,有时可能希望根据稍后创建的表创建视图,或者在创建视图时没有足够的权限访问表。在这些情况下,可以使用FORCE选项。
column_aliases
从定义查询的选择列表派生的视图的列名称。 但是,定义查询的列名可能包含不能用于视图定义的函数或表达式。
要解决这个问题,有两个选择:

  1. 使用符合定义查询的SELECT子句中的命名规则的列别名。
  2. 为CREATE VIEW和AS子句之间的视图列显式指定列别名。

WITH READ ONLY
子句防止底层表通过视图进行更改。
WITH CHECK OPTION
句保护视图免受对基础表的任何更改,这些更改将生成未包含在定义查询中的行。

  1. 创建一个视图的例子
Create or  REPLACE  view detectingView 
(name_vehicle,minsal,maxsal,avgsal) 
as 
select a.VEHICLE_NO,a.ATMO_HUMIDITY,a.AXLE_AMOUNT,a.ATMO_PRESSURE from info_detect_base a;
创建了一个简单的试图,只查询一个表
CREATE OR REPLACE VIEW   DETETCT_POWER_info_vehicle

AS
select * from info_detect_base a where a.DETECT_SN in
(
select DETECT_SN from info_detect_record 
);

创建一个 复杂试图,查询两张表
CREATE OR REPLACE VIEW customer_credits(
        customer_id,
        name,
        credit
    ) AS 
SELECT
        customer_id,
        name,
        credit_limit
    FROM
        customers WITH READ ONLY;
创建一个只读视图
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;
连接视图是其定义查询包含连接(例如,内连接或左连接)的视图。 以下语句创建一个名为backlog的视图,其定义查询包含连接三个表的联接子句:orders,order_items和products。三个表之间的关系如下所示 -

视图的优点:
1.安全:根据个人的权限只允许看到某几个字段
2.隐藏数据的复杂性
3.简化用户的SQL命令
4.将引用程序与基表的修改隔离

注意:
1.视图不能包含伪列(currval,nextval,rownum)
2.视图中如果包含连接,集合分组等函数不能删除更新插入只能查询(常见视图都是用于查询了,基本上不会出现更改)
3.基表和视图的数据是绑定的
4.视图中可以使用分组函数

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!