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 ...
除其他外, Oracle和PostgreSQL支持实例化视图 。 其他数据库(例如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
sql 视图嵌套视图