什么时候以及为什么有些人决定他们需要在他们的数据库中创建一个视图?为什么不运行一个普通的存储过程或选择?


当前回答

我通常创建视图来反规范化和/或聚合经常用于报告目的的数据。

EDIT

By way of elaboration, if I were to have a database in which some of the entities were person, company, role, owner type, order, order detail, address and phone, where the person table stored both employees and contacts and the address and phone tables stored phone numbers for both persons and companies, and the development team were tasked with generating reports (or making reporting data accessible to non-developers) such as sales by employee, or sales by customer, or sales by region, sales by month, customers by state, etc I would create a set of views that de-normalized the relationships between the database entities so that a more integrated view (no pun intended) of the real world entities was available. Some of the benefits could include:

减少编写查询时的冗余 建立关联实体的标准 提供机会 评估和最大化绩效 用于复杂的计算和连接 (例如在Schemabound视图上建立索引 在该软件中) 让数据更容易获取 对于团队成员和非开发人员来说是直观的。

其他回答

关注特定的数据 视图允许用户专注于他们感兴趣的特定数据和他们负责的特定任务。不必要的数据可以从视图中删除。这还提高了数据的安全性,因为用户只能看到视图中定义的数据,而不能看到底层表中的数据。有关将视图用于安全目的的更多信息,请参见将视图用作安全机制。

To Simplify Data Manipulation Views can simplify how users manipulate data. You can define frequently used joins, projections, UNION queries, and SELECT queries as views so that users do not have to specify all the conditions and qualifications each time an additional operation is performed on that data. For example, a complex query that is used for reporting purposes and performs subqueries, outer joins, and aggregation to retrieve data from a group of tables can be created as a view. The view simplifies access to the data because the underlying query does not have to be written or submitted each time the report is generated; the view is queried instead. For more information about manipulating data.

还可以创建逻辑上作为参数化视图操作的内联用户定义函数,或者在where子句搜索条件中具有参数的视图。有关更多信息,请参见内联用户定义函数。

自定义数据 视图允许不同的用户以不同的方式查看数据,即使他们同时使用相同的数据。当具有许多不同兴趣和技能水平的用户共享同一个数据库时,这是特别有利的。例如,可以创建一个视图,该视图仅检索与客户经理打交道的客户的数据。该视图可以根据使用该视图的帐户经理的登录ID确定检索哪些数据。

To Export and Import Data Views can be used to export data to other applications. For example, you may want to use the stores and sales tables in the pubs database to analyze sales data using Microsoft® Excel. To do this, you can create a view based on the stores and sales tables. You can then use the bcp utility to export the data defined by the view. Data can also be imported into certain views from data files using the bcp utility or BULK INSERT statement providing that rows can be inserted into the view using the INSERT statement. For more information about the restrictions for copying data into views, see INSERT. For more information about using the bcp utility and BULK INSERT statement to copy data to and from a view, see Copying To or From a View.

To Combine Partitioned Data The Transact-SQL UNION set operator can be used within a view to combine the results of two or more queries from separate tables into a single result set. This appears to the user as a single table called a partitioned view. For example, if one table contains sales data for Washington, and another table contains sales data for California, a view could be created from the UNION of those tables. The view represents the sales data for both regions. To use partitioned views, you create several identical tables, specifying a constraint to determine the range of data that can be added to each table. The view is then created using these base tables. When the view is queried, SQL Server automatically determines which tables are affected by the query and references only those tables. For example, if a query specifies that only sales data for the state of Washington is required, SQL Server reads only the table containing the Washington sales data; no other tables are accessed.

Partitioned views can be based on data from multiple heterogeneous sources, such as remote servers, not just tables in the same database. For example, to combine data from different remote servers each of which stores data for a different region of your organization, you can create distributed queries that retrieve data from each data source, and then create a view based on those distributed queries. Any queries read only data from the tables on the remote servers that contains the data requested by the query; the other servers referenced by the distributed queries in the view are not accessed.

When you partition data across multiple tables or multiple servers, queries accessing only a fraction of the data can run faster because there is less data to scan. If the tables are located on different servers, or on a computer with multiple processors, each table involved in the query can also be scanned in parallel, thereby improving query performance. Additionally, maintenance tasks, such as rebuilding indexes or backing up a table, can execute more quickly. By using a partitioned view, the data still appears as a single table and can be queried as such without having to reference the correct underlying table manually.

如果满足以下条件之一,分区视图是可更新的: 在视图上定义了一个INSTEAD OF触发器,其逻辑支持INSERT、UPDATE和DELETE语句。

视图和INSERT、UPDATE和DELETE语句都遵循为可更新分区视图定义的规则。有关更多信息,请参见创建分区视图。

https://technet.microsoft.com/en-us/library/aa214282 (v = sql.80) . aspx # sql:加入

当我想要查看一个表的快照和/或视图(以只读方式)时

关于视图的一件奇怪的事情是,它们被Microsoft Access视为表:当您使用ODBC将Microsoft Access前端附加到SQL数据库时,您将在可用表列表中看到表和视图。因此,如果你在MS Access中准备复杂的报告,你可以让SQL服务器来做连接和查询,这大大简化了你的工作。在Excel中准备查询也是如此。

我认为第一个。隐藏查询的复杂性。它非常适合于视图。当我们规范化数据库表时如何增加。现在,当表数量增加时,获取数据是非常困难的。所以最好的处理方法是遵循视图。如果我错了,请纠正我。

视图相对于存储过程的一个主要优点是,您可以像使用表一样使用视图。也就是说,可以在查询的FROM子句中直接引用视图。例如,SELECT * FROM dbo.name_of_view。

在几乎所有其他方面,存储过程都更强大。你可以传入参数,包括输出参数,让你一次有效地返回几个值,你可以做SELECT, INSERT, UPDATE和DELETE操作,等等。

如果你想要一个View能够从from子句中进行查询,但你也想要能够传入参数,也有一种方法可以做到这一点。它叫做表值函数。

这里有一篇关于这个主题的非常有用的文章:

http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html

编辑:顺便说一下,这就提出了一个问题,视图比表值函数有什么优势?对此,我没有一个很好的答案,但我要指出,创建视图的T-SQL语法比创建表值函数要简单,数据库用户可能更熟悉视图。