本节介绍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
命令,以便您可以指定用户可以针对该视图执行哪些操作。 请注意,在这种情况下,不会授予对基础表的任何权限,因为可能不希望用户绕过视图来直接访问基表。