什么是SQL视图?

您可能已经知道“普通视图”,但是我敢肯定,您会在本文中找到一两种尚未想到的东西……

什么是SQL视图?

SQL中的视图是一种与“普通”表相同的处理复杂查询的方法。 实际上,SQL全部与表(它们是记录袋)有关,就像关系代数全部与关系(它们是元组集合)一样。

有不同类型的视图:

“普通”观点

这些通常称为“视图”。 大多数数据库允许使用此语法声明它们

CREATE VIEW my_view AS 
SELECT col1, col2
FROM my_table
WHERE ...

这些存储的视图随后成为目录的一部分,可以像表一样通过名称进行引用,非常适合重用。 更重要的是,您可以向视图授予与表不同的特权集,这使您仅可以使用视图来实现完整的安全层(例如,对某些用户隐藏某些列或行)

一些数据库(包括Oracle,PostgreSQL)甚至允许在某些情况下对其进行更新-多数情况下,当它们是明确的时,单个表的1-1映射不会产生任何计算或非规范化。

物化视图

就像上面的“普通视图”一样,物化视图可以像表一样使用。 实际上,它们是表,因为其数据是在磁盘上实现的,每当内容更新时都会更新。 这些对于很少更新的数据进行频繁,复杂的查询很有用。

只需添加MATERIALIZED关键字即可完成设置:

CREATE MATERIALIZED VIEW my_view AS 
SELECT col1, col2
FROM my_table
WHERE ...

除其他外, OraclePostgreSQL支持实例化视图 。 其他数据库(例如SQL Server)知道“索引视图” ,因为您必须在索引中显式“物化”视图数据,所以它们的功能要弱一些。

“快照”视图

这些不是真正的视图,它们是真实的表。 但是在此博客文章的背景下,您可以将它们视为数据的永久物化“快照”视图。 您可以使用不同的语法创建此类视图:

大多数数据库,例如Oracle
CREATE TABLE my_view AS
SELECT col1, col2
FROM my_table
WHERE ...
一些数据库,例如SQL Server
SELECT col1, col2
INTO my_view
FROM my_table
WHERE ...

这种方法的优点在于,与物化视图一样,这些“视图”对于频繁查询也非常有用–您只需预先计算一次数据。 但是,一旦计算出数据,便会生成一个“快照”,并且数据可以继续独立于您的视图而生活,就像快照一样! (不过,不要忘记添加相关索引)

请注意,包括DB2和Oracle在内的某些数据库支持真实的SQL:2011标准“快照”,例如Oracle中的闪回查询DB2中的时间旅行查询 。 但是,那是另外一个故事。

参数化视图

很少有人将这些视图称为“视图”,但是如果您考虑一下,那实际上就是它们。 表值函数是存储过程,它们返回表,然后可以在SQL中再次使用表。 例如(使用PostgreSQL语法):

CREATE FUNCTION my_view (arg1 INTEGER, arg2 INTEGER)
RETURNS TABLE (
    col1 INTEGER
    col2 INTEGER
)
AS $$
BEGIN
    RETURN QUERY
    SELECT col1, col2
    FROM my_table
    WHERE v1 = arg2 AND v2 = arg2;
END
$$ LANGUAGE plpgsql;

然后…

SELECT *
FROM my_view (42, 1337)
WHERE ...

那是非常强大的,不是吗? 除其他外,Firebird,HANA,HSQLDB,Oracle,PostgreSQL,SQL Server支持表值函数。

常用表表达式

与普通视图一样,这些视图被命名,但是它们仅适用于单个语句(主要是SELECT语句),尽管PostgreSQL或SQL Server还允许将公用表表达式与其他DML语句一起使用。 这些“观点”可以这样写:

WITH 
    my_view_a AS (
        SELECT ...
    ),
    my_view_b AS (
        SELECT ...
    )
-- To be consumed immediately by a statement
SELECT *
FROM my_view_a, my_view_b

尽管公用表表达式对于结构化代码非常有用(它们就像“表变量”),但是它们在Oracle或PostgreSQL中是有代价的,因为视图通常是临时实现的,这阻止了优化器中的许多SQL转换。 。 另一方面,常见的表表达式可以是递归/分层的,这对于图形/树遍历非常有用。

派生表

视图的最常见类型(尽管很少称为“视图”)是派生表,即放在FROM子句中的所有嵌套选择语句。 例如:

SELECT *
FROM (
    SELECT ...
) my_view_a, (
    SELECT ...
) my_view_b

与普通表表达式不同,派生表无法在语句中轻松重用,但是很有可能将它们优化为具有更高性能的其他语句。

结论

SQL全部涉及临时查询中的表和表重组。 任何SQL语句中最重要的子句是FROM子句。 它以各种方式指定要重组,过滤,分组,投影的元组集。 正如我们在上面看到的,您可以通过上述一种创建视图的方式将任何这样的表转换轻松地馈送到另一个转换中。

好奇更多吗? 阅读我们的热门文章“ 全面理解SQL的10个简单步骤

翻译自: https://www.javacodegeeks.com/2015/06/what-exactly-are-sql-views.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值