创建视图时,我基本上是在创建一个新表,当其中一个表中的数据发生变化时,该表将自动进行处理。那是对的吗?
另外,为什么我不能在视图中使用子查询?
视图的工作方式 类似于表 ,但不是表。它永远不存在;它只是在引用视图名称时运行的准备好的SQL语句。IE浏览器:
CREATE VIEW foo AS SELECT * FROM bar SELECT * FROM foo
…相当于运行:
SELECT x.* FROM (SELECT * FROM bar) x
MySQLDump将永远不会包含要插入视图中的行…
另外,为什么我不能在视图中使用子查询????
遗憾的是,这是出于(尽管是有问题的)设计。MySQL视图有很多限制,已记录在案:http : //dev.mysql.com/doc/refman/5.0/en/create- view.html
不可以。一个表可以具有关联的索引,这可以使数据检索更快(在插入/更新时要付出一定的代价)。一些数据库支持“物化”视图,即可以对其应用索引的视图- 考虑到有限的视图功能(这只在v5 IIRC中开始,很晚才开始),MySQL 不支持就 不足为奇了)。
由于视图是派生表,因此视图的性能仅取决于其建立的查询。如果该查询很烂,性能问题将只是滚雪球……也就是说,在查询视图时- 如果WHERE子句中的视图列引用未包装在函数中(IE :WHERE v.column LIKE ..., 不是 WHERE LOWER(t.column) LIKE ...),则优化器可能会推入条件(称为谓词)添加到原始查询中-使其速度更快。
WHERE v.column LIKE ...
WHERE LOWER(t.column) LIKE ...