我创建了一个视图:
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
这导致返回视图中的数据。没有任何基础表来保存数据。但是系统仍在显示记录。这怎么可能?
答案 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
视图可以被视为虚拟表或存储查询。通过视图可访问的数据不会作为不同的对象存储在数据库中。存储在数据库中的是 SELECT语句。 SELECT语句的结果集形成视图返回的虚拟表。用户可以通过引用Transact-SQL语句中的视图名称来使用此虚拟表,方法与引用表的方式相同。
答案 2 :(得分:2)
视图是案例视图定义中的Saved Select Statement
没有任何基础表,但select语句本身具有硬编码(常量)值。
因此它将始终返回此数据。
再次要明确的是,它不存储任何数据,而是Select语句,它恰好返回一些常量值。
答案 3 :(得分:1)
是的,显示的数据是因为静态包含在查询本身中。
我在这里看不到任何不常见的内容,该视图指的是嵌入数据的查询。