【发布时间】:2011-03-21 13:33:21
【问题描述】:
什么是 MySQL 中的视图?什么是观点以及它们在现实世界中的使用频率。
我是在外行解释之后,如果可能的话,请举个例子来帮助我理解!
提前谢谢你;-)
【问题讨论】:
什么是 MySQL 中的视图?什么是观点以及它们在现实世界中的使用频率。
我是在外行解释之后,如果可能的话,请举个例子来帮助我理解!
提前谢谢你;-)
【问题讨论】:
这篇小文章很好地解释了MySQL中的视图:Views and More in MySQL 5.0
【讨论】:
您可以将视图视为动态生成的表。在您的查询中,它的行为类似于普通表,但不是存储在磁盘上,而是在需要时从创建视图时定义的 SQL 语句动态创建。
要创建视图,请使用:
CREATE VIEW first_names AS SELECT first_name FROM people WHERE surname='Smith'
然后您可以将此视图用作普通表。诀窍是当您更新表 people 时,first_names 视图也会更新,因为它只是 SELECT 语句的结果。
这个查询:
SELECT * FROM first_names
将返回表 people 中名为 Smith 的人的所有名字。如果您更新 people 表并重新运行查询,您将看到更新后的结果。
基本上,您可以用嵌套的 SELECT 语句替换视图。但是,视图有一些优势:
【讨论】:
很简单:视图是虚拟表。
视图基于对“真实”表的 SELECT 查询,但不同之处在于视图不像真实表那样存储信息。视图只引用表并按照 SELECT 所说的方式组合它们。这使得经常使用的查询更加简化。
这是一个简单的例子。假设您有一张员工表和一张部门表,并且您想查看他们的薪水。首先,您可以创建工资视图。
CREATE VIEW SALARIES
AS
SELECT e.name,
e.salary,
d.name
FROM employees AS e, deparments as d
WHERE e.depid = d.depid
ORDER BY e.salary DESC
此查询列出员工姓名、工资和部门,并按工资降序排列。完成此操作后,您可以使用以下查询:
SELECT * from SALARIES
在更大的范围内,您可以创建一个计算员工平均工资的视图,并列出工资低于平均工资的人员。在现实生活中,此类查询要复杂得多。
【讨论】:
视图是一种预先定义某些查询的方式。它可以像表一样被查询,由查询定义而不是磁盘上的一组数据。查询它可以查询表的结果。
在大多数情况下,查询视图可以视为等效于将视图的定义查询用作主查询中的子查询。视图允许查询更短和更模块化(因为公共部分在视图中单独定义)。它们还提供了优化的机会(尽管并非所有数据库都这样做;我不确定 MySQL 是否提供任何优化以使视图更快)。
如果您更新基础表,针对视图的查询将自动反映这些更改。
【讨论】:
普通视图只不过是可查询的查询。
例子:
您有两个表,orders 和 customers,orders 有 id、customer_id、performance_date 字段,customers 有 id、first_name、last_name。
现在假设您想同时显示订单 ID、执行日期和客户名称,而不是发出此查询:
SELECT o.id as order_id, c.first_name + ' ' + c.last_name as customer_name,
o.performance_date
FROM orders o inner join customers c
您可以将该查询创建为视图并将其命名为 orders_with_customers,您现在可以在您的应用程序中发出查询
SELECT *
FROM orders_with_customer
一个好处是抽象,您可以更改存储客户姓名的方式,例如包含中间名,并且只需更改视图查询。所有使用该视图的应用程序都会继续这样做,但现在包含中间名。
【讨论】:
在 mysql 中,视图是一个存储的选择语句
【讨论】:
简单来说
在 SQL 中,视图是虚拟表 基于 SQL 的结果集 声明。
一个视图包含行和列,只是 像一张真正的桌子。 a中的字段 视图是来自一个或多个真实的字段 数据库中的表。
您可以添加 SQL 函数、WHERE 和 将语句加入视图并呈现 数据好像数据即将到来 一张桌子。
除此之外,您可以从view 在基础table 中插入行,前提是视图引用了唯一一个表并且视图中未引用的列允许为空。
【讨论】:
它们是常用过滤器的简写。
假设您有一个包含已删除列的记录表。通常您不会对已删除的记录感兴趣,因此您可以创建一个名为 Records 的视图,从 AllRecords 表中过滤掉已删除的记录。
这将使您的代码清理干净,因为您不必在每个语句中附加/前置deleted != 1。
SELECT * FROM Records
将返回所有未删除的记录。
【讨论】: