使用 SELECT * 创建 MYSQL VIEW

Posted

技术标签:

【中文标题】使用 SELECT * 创建 MYSQL VIEW【英文标题】:Creating MYSQL VIEW with SELECT * 【发布时间】:2017-11-28 22:49:11 【问题描述】:

mysql 中创建视图

如果我写SELECT * FROM ... as a VIEW,视图会将其永久存储为 * 还是实际选择当前列并将查询存储为那个(而不是存储SELECT *,它将存储SELECT foo,bar,biz 等)

我多次阅读到使用SELECT * FROM ... 是不好的做法,原因有很多,包括提到的HERE 和HERE。所以我确实希望避免这些问题。

【问题讨论】:

【参考方案1】:

在 MySQL 中创建存储视图可能会带来意想不到的性能后果。仔细考虑创建存储视图是否是该问题的适当解决方案。或者,创建视图是否会潜在地产生比实现它要解决的问题更大的问题。


假设表 test.foo 存在,您提出的问题可以用一个简单的测试用例来回答...

 USE test ; 

 CREATE VIEW voo AS SELECT * FROM foo ;

 SHOW CREATE VIEW voo ; 

 DROP VIEW voo ;

【讨论】:

感谢您的回复我不知道存在未存储的视图之类的东西,这可能会让我重写我的问题。例如,存储视图与简单地在 phpmyadmin 中创建视图不同吗? 一个 stored 视图而不是 inline 视图。在 MySQL 用语中,内联视图被称为“派生表”,例如SELECT * FROM (SELECT * FROM foo) voo. 括号之间的位有一个“内联视图”,分配了一个别名“voo”。我们可以创建一个 stored 视图定义(作为答案中的示例),然后 SELECT * FROM voo 达到相同的净效果(和性能问题)。不同之处在于,voo 的定义存在于查询中 inline 中,并且仅在该上下文中可用。 存储的视图在其他上下文中可用。

以上是关于使用 SELECT * 创建 MYSQL VIEW的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 获取最低值的记录 | View 的 SELECT 包含 FROM 子句中的子查询

MySQL的视图

MySQL - View 的 SELECT 在 FROM 子句中包含一个子查询

为啥 MySQL View 和同一个 View 的底层 SELECT 查询返回不同的结果?

为啥在 MySQL 中每个有效的 SELECT 都不是有效的 VIEW?

133 MySQL视图事务索引(都很重要)