如何在MySQL中将“视图”存储为永久表?

时间:2019-01-23 15:05:07

标签: mysql sql

我是SQL的新手,仍然在学习。

一旦我对表(例如表1)进行了操作以获得视图。如何将该视图转换/转换/存储到新的永久表中(表2)?另外,是否可以将其存储在同一表(表1)中?

我的代码是这样的:

select `Date`, `Close Price`,
round(avg(`Close Price`) over (order by `date` asc rows 19 preceding), 2) 
as '20 Day MA' 
from table1;  -- this is my view

然后我想用table1或新表来存储此视图(各列  日期,收盘价,20天前

基本上是
旧表:日期,收盘价

新表格:日期,收盘价,20天_ma

添加新列 20_day_ma 也许更简单,但是我不知道如何添加依赖于其他列的新值。

编辑:

所以尝试一下:

DELIMITER $$
-- create table1
drop table if exists table1;

create table table1 as
select STR_TO_DATE(`Date`, '%d-%M-%Y') as `Date`, `Close Price`,
round(avg(`Close Price`) over (order by `date` asc rows 19 preceding), 2) as 
'20 Day MA'
from source_table $$

DELIMITER ;

我不断收到错误消息:命令不同步

3 个答案:

答案 0 :(得分:1)

您可以做三件事: 1>创建一个视图(您将引用该视图就像是一个表一样)

create view my_new_view as
select `Date`, `Close Price`,
round(avg(`Close Price`) over (order by `date` asc rows 19 preceding), 2) 
as '20 Day MA' 
from table1; 

然后使用select * from myview

读取数据

如果您需要表格的“快照”,可以使用select into

“实现”
CREATE TABLE my_new_table -- mysql syntax
select `Date`, `Close Price`,
round(avg(`Close Price`) over (order by `date` asc rows 19 preceding), 2) 
as '20 Day MA' 
-- into my_new_table --this forces the creation of new table -- sorry: SQL SERVER syntax
from table1

第三个选项是添加新列,而不是调用“更新”来填充

答案 1 :(得分:1)

从结果集中创建新表很简单。 CREATE ... SELECT is the way

 CREATE my_new_table AS
 SELECT whatever FROM sometable;

您需要为选择的每一列提供有效的列名(别名)。

专业提示:请勿创建用于提供视图的表格。每次使用视图时,它都会从基础表中获取最新和最大的数据。但是,创建表时,它是及时的快照。

专业提示:教授不是专家,因此他们可能会给您练习以完成现实世界中的坏主意。

答案 2 :(得分:1)

您有以下选择:

  • 视图:不存储数据,每次查询时,都会针对源表运行查询

  • “材料化视图”:MySQL中没有这样的构造,但是您可以使用源表上的触发器来模拟它。如果创建,更新或删除了行,则可以更新实例化视图。尝试搜索它,这里有很好的描述。 如果源表很少更新,则很有用。如果您的select很复杂,可能会有点困难。

  • 临时表:CREATE TEMPORARY TABLE t1 (...);INSERT INTO t1 SELECT (your query);(可以缩短为CREATE TEMPORARY TABLE t1 AS SELECT (your query))。这些表创建当前状态的快照,并且只要连接有效(即使通过事务处理)就可以使用,但是不能在连接之间共享。您可以添加索引等以加快查询速度。如果您有一个复杂的流程需要存储该流程中多次处理的数据,这将非常有用。

  • 创建一个存储值的列,并创建一个MySQL EVENT来定期对其进行更新。

恕我直言,由于20天移动平均值应该每天更新,因此最后的解决方案是最好的。如果您不信任MySQL或拥有其他作业调度程序,则也可以从那里调用updater SQL语句。