创建视图

已完成

视图 简化了在 SQL Server 中访问和呈现数据的方式。 作为 SQL 开发人员,可以创建视图来封装复杂查询、提供安全边界,以及以符合应用程序需求的格式呈现数据。

了解 SQL Server 中的视图

视图是基于SELECT语句的虚拟表。 与物理表不同,视图本身不会存储数据。 相反,每次查询基础表时,它们都会从基础表中检索数据。

显示视图如何从基础表检索数据的示意图。

使用视图,您可以将JOIN 子句、计算和筛选器的复杂性从应用程序代码中隐藏。 例如,如果应用程序经常需要具有产品详细信息的客户订单,则可以创建跨“客户”、“订单”和“产品”表使用的 JOIN 视图。 然后,应用程序查询单个视图,而不是重复编写相同的复杂 JOIN

视图还提供安全层。 你可以通过视图向用户授予对特定列的访问权限,同时限制对基础表的访问。 此方法允许你仅公开用户所需的数据,而无需授予他们完整的表访问权限。

创建基本视图

使用 CREATE VIEW 语句后跟 SELECT 查询创建视图。 视图定义确定查询视图时显示的数据。

下面是合并客户和订单信息的简单视图:

CREATE VIEW Sales.CustomerOrders
AS
SELECT 
    c.CustomerID,
    c.CustomerName,
    c.Email,
    o.OrderID,
    o.OrderDate,
    o.TotalAmount
FROM Sales.Customers c
INNER JOIN Sales.Orders o ON c.CustomerID = o.CustomerID;

创建此视图后,可以像查询任何表一样对其进行查询:

SELECT * FROM Sales.CustomerOrders
WHERE CustomerName = 'Contoso Ltd';

该视图执行基础 SELECT 语句并返回结果,就像它们来自单个表一样。 这种简化使应用程序代码更简洁、更易于维护。

还可以使用计算列创建视图。 以下视图添加按大小对订单进行分类的列:

CREATE VIEW Sales.OrderSummary
AS
SELECT 
    OrderID,
    CustomerID,
    OrderDate,
    TotalAmount,
    CASE 
        WHEN TotalAmount < 100 THEN 'Small'
        WHEN TotalAmount < 1000 THEN 'Medium'
        ELSE 'Large'
    END AS OrderSize
FROM Sales.Orders;

此视图在一个位置处理分类逻辑。 针对 OrderSummary 的每个查询都会获得相同的计算,而无需复制 CASE 表达式。

设计注意事项的应用

设计视图时,请考虑如何使用和维护视图。 设计良好的视图平衡了简单性、性能和安全性。

显式指定列名,而不是使用 SELECT *。 显式列使视图更易于维护,并在基础表发生更改时防止意外结果。 如果有人将列添加到基表,则视图定义保持一致:

CREATE VIEW Sales.ActiveCustomers
AS
SELECT 
    CustomerID,
    CustomerName,
    Email,
    Phone
FROM Sales.Customers
WHERE IsActive = 1;

当视图将处理数据修改时,使用 WITH CHECK OPTION 句。 此选项可确保通过视图的 INSERTUPDATE 语句仅影响视图中显示的行:

CREATE VIEW Sales.HighValueOrders
AS
SELECT 
    OrderID,
    CustomerID,
    OrderDate,
    TotalAmount
FROM Sales.Orders
WHERE TotalAmount > 1000
WITH CHECK OPTION;

使用此选项,无法通过 HighValueOrders 视图插入 TotalAmount 为 500 的订单。 数据库拒绝该作,因为新行不符合视图 WHERE 的条件。

使视图定义专注于特定用途。 尝试实现多种用途的视图往往难以优化和理解。 为不同的用例创建单独的视图,而不是生成一个复杂视图。

确定何时使用视图

视图在其特征提供明确优势的特定场景中表现出色。 了解这些方案有助于为每个情况选择合适的工具。

使用视图来简化多个应用程序或用户需要执行的复杂查询。 不必让每个人都了解联接具有特定条件的五个表的复杂性,只需创建一个视图。 这种集中化还意味着可以在一个位置优化或修改逻辑。

如果需要在列或行级别限制数据访问,请考虑视图。 视图只能显示适合角色的列,同时隐藏敏感信息。 结合适当的权限,视图允许你授予对特定数据的访问权限,而无需公开整个表。

视图非常适合用于以不同格式呈现数据,以实现不同的目的。 你可能有一个 包含 技术详细信息的产品表,但报表团队需要一个包含计算字段的简化版本。 创建一个视图,该视图可相应地转换和聚合数据。

同时,识别在何种情况下其他对象更为合适。 对于始终返回相同结果的性能关键查询,索引视图(具体化视图)以物理方式存储结果集。 对于接受参数的复杂计算,用户定义的函数可提供更大的灵活性。 对于数据修改逻辑,存储过程提供更好的控制。

如果需要封装可重用查询逻辑而不使用参数,并且想要以简化的方式呈现数据,视图就是解决方案。 它们弥合了物理数据库结构和应用程序所需的数据的逻辑视图之间的差距。