View可以保存一些数据吗?

时间:2014-07-03 13:37:24

标签: sql sql-server sql-server-2008

我创建了一个视图:

 CREATE VIEW Lunch
AS
  SELECT 'Beer' AS item
  UNION SELECT 'Olives'
  UNION SELECT 'Bread'
  UNION SELECT 'Salami'
  UNION SELECT 'Calamari'
  UNION SELECT 'Coffee';
GO

然后我在另一个查询中执行了以下查询。

SELECT item FROM Lunch

这导致返回视图中的数据。没有任何基础表来保存数据。但是系统仍在显示记录。这怎么可能?

4 个答案:

答案 0 :(得分:3)

我不完全理解这个问题。该视图不是“持有数据”,而是持有查询。查询语句中包含常量,这些常量被转换为可供其他查询使用的结果集。

您可以将查询视为将查询文本直接替换为语句。所以,当你这样做时:

select *
from lunch;

SQL实际上将其处理为:

select *
from ( SELECT 'Beer' AS item
       UNION SELECT 'Olives'
       UNION SELECT 'Bread'
       UNION SELECT 'Salami'
       UNION SELECT 'Calamari'
       UNION SELECT 'Coffee'
     ) t

这是一个很好的模型,虽然它不是真正发生的事情。真正发生的是编译视图并将编译后的代码插入到查询的编译代码中。

还有另一个“物化观点”的概念。这些是您拥有索引并且值实际存储在数据库中的视图。但是,这不是物化视图的示例。

答案 1 :(得分:2)

它实际上并不包含数据,但它可以评估SQL,这就是你在定义中所做的一切。

因此可以评估以下内容:

SELECT 'Beer' AS item
  UNION SELECT 'Olives'
  UNION SELECT 'Bread'
  UNION SELECT 'Salami'
  UNION SELECT 'Calamari'
  UNION SELECT 'Coffee';

与使用以下内容定义的视图相同:

SELECT * FROM Customers

SQL View Reference:

  

视图可以被视为虚拟表或存储查询。通过视图可访问的数据不会作为不同的对象存储在数据库中。存储在数据库中的是 SELECT语句。 SELECT语句的结果集形成视图返回的虚拟表。用户可以通过引用Transact-SQL语句中的视图名称来使用此虚拟表,方法与引用表的方式相同。

答案 2 :(得分:2)

视图是案例视图定义中的Saved Select Statement没有任何基础表,但select语句本身具有硬编码(常量)值。

因此它将始终返回此数据。

再次要明确的是,它不存储任何数据,而是Select语句,它恰好返回一些常量值。

答案 3 :(得分:1)

是的,显示的数据是因为静态包含在查询本身中。

我在这里看不到任何不常见的内容,该视图指的是嵌入数据的查询。