2016-11-05 53 views
0

我有一个 - 也许很简单 - 关于如何评估create viewselect ... from viewname的问题。我知道如何创建视图并使用它们,但我必须用图形和文本解释这两个命令的过程。如何在SQL中评估“创建视图”?

嗯,我做了以下(我使用Microsoft SQL Server 2012的时刻,但这不应该的问题,不是我想知道它的MySQL过,如果有差异?):

-- create a Schema for the test 
create schema TEMP 
go 

-- create the view 
create view TEMP.VLT as 
select LNR,TNR,MENGE 
from LTP.LTP 
go 

-- select the data from the view 
select * from TEMP.VLT 

A view就像是一个选择查询的别名,这是一个类似子查询的东西,对吗?如果是这样,我说的对,那

select * from TEMP.VLT 

相同

select * from (select LNR,TNR,MENGE from LTP.LTP) as VLT 

我的意思是,我知道它给出了相同的结果,但实际上是以相同的方式评估,还是我错了?

谢谢你的回应! eisenbahnfan

+0

我删除了mysql标签,因为代码显然是SQL Server。 –

+0

谢谢 - 但是,正如我所说的,如果有任何区别,我也想知道mysql的情况。所以我想,也可以使用这个标签... – eisenbahnfan

回答

0

您的理解在很高的层次上是正确的。首先,数据库中的视图可能有所不同特别是,MySQL有很多限制,例如FROM子句中没有子查询。但是,事实上,MySQL几乎按照您描述的方式运行。

你有正确的理解。视图的代码被合并到正在被引用的查询中。下面是在documentation特定语言:

当SQL语句引用非索引视图,解析器和 查询优化器同时分析SQL语句的源和 视图,然后将它们分解成一个单一的执行计划。 SQL语句的一个计划并没有 ,并且该视图有一个单独的计划。

有一种称为“索引视图”的视图,它实际上实现了数据。在这种情况下,视图的代码并未实际运行,但查询中使用了结果。

+0

非常感谢您的回复! ...........但是我已经在MySQL的from子句中尝试了子查询,并且它工作('mysql> select * from(select * from test)as X;') – eisenbahnfan

+0

@eisenbahnfan。 。这在视图中不起作用。您可以在这里查看限制:http://dev.mysql.com/doc/refman/5.7/en/view-restrictions.html。 –

0

你是对的。在SQL中,a.view只是一个逻辑抽象。 不要与物化视图混淆(在oracle中,其他数据库有不同的名称),而是包含以固定时间间隔通过查询获取的复制数据

+0

非常感谢你为这个非常快的反应! 所以,你的意思是,在Oracle中,数据就像是一个副本,它的更新类似cronjob或插入/更新触发器之后? (我知道这是一个有点偏离主题,因为我要求MS SQL-Svr和MySQL,但我现在对此感兴趣;-)) – eisenbahnfan

+0

编号在oracle中,视图是一种逻辑结构,它'隐藏'一个问题。此外,它确实存在一个称为物化视图的结构,其行为如刚才所说 – Massimo