MySQL Views

摘要:在本教程中,您将了解 MySQL 视图以及如何有效地操作视图。

MySQL 视图简介

让我们看看示例数据库中的customerspayments的下表。

查询使用内连接返回来自customers表和payments表的数据:

SELECT 
    customerName, 
    checkNumber, 
    paymentDate, 
    amount
FROM
    customers
INNER JOIN
    payments USING (customerNumber);
Code language: SQL (Structured Query Language) (sql)

这是输出:

下次,如果您想获得相同的信息,包括客户姓名、支票号码、付款日期和金额,则需要再次发出相同的查询。

一种方法是将查询保存在文件(.txt 或 .sql 文件)中,以便稍后可以从 MySQL Workbench 或任何其他 MySQL 客户端工具打开并执行它。

更好的方法是将查询保存在数据库服务器中并为其指定名称。此命名查询称为数据库视图,或简称为视图

根据定义,视图是存储在数据库目录中的命名查询。

要创建新视图,请使用CREATE VIEW语句。此语句根据上面的查询创建一个视图customerPayments

CREATE VIEW customerPayments
AS 
SELECT 
    customerName, 
    checkNumber, 
    paymentDate, 
    amount
FROM
    customers
INNER JOIN
    payments USING (customerNumber);
Code language: SQL (Structured Query Language) (sql)

一旦执行CREATE VIEW语句,MySQL 就会创建视图并将其存储在数据库中。

现在,您可以在 SQL 语句中将视图作为表引用。例如,您可以使用SELECT语句从customerPayments视图查询数据:

SELECT * FROM customerPayments;
Code language: SQL (Structured Query Language) (sql)

正如您所看到的,语法要简单得多。

请注意,视图并不物理存储数据。当您对视图发出SELECT语句时,MySQL 将执行视图定义中指定的基础查询并返回结果集。因此,有时视图被称为虚拟表。

MySQL 允许您基于从一个或多个表检索数据的SELECT语句创建视图。下图展示了基于多个表的列的视图:

MySQL视图

此外,MySQL甚至允许您创建不引用任何表的视图。但在实践中你很少会发现这种观点。

例如,您可以通过执行以下查询创建一个名为daysofweek的视图,该视图返回一周中的 7 天:

CREATE VIEW daysofweek (day) AS
    SELECT 'Mon' 
    UNION 
    SELECT 'Tue'
    UNION 
    SELECT 'Web'
    UNION 
    SELECT 'Thu'
    UNION 
    SELECT 'Fri'
    UNION 
    SELECT 'Sat'
    UNION 
    SELECT 'Sun';
Code language: SQL (Structured Query Language) (sql)

您可以从daysofweek视图中查询数据,如下所示:

SELECT * FROM daysofweek;
Code language: SQL (Structured Query Language) (sql)

该图显示了输出:

MySQL 视图的优点

MySQL 视图具有以下优点。

1)简化复杂查询

视图有助于简化复杂的查询。如果您有任何经常使用的复杂查询,您可以基于它创建一个视图,以便您可以使用简单的SELECT语句引用该视图,而不用重新键入查询。

2)使业务逻辑一致

假设您必须在每个查询中重复编写相同的公式。或者您有一个具有复杂业务逻辑的查询。为了使该逻辑在查询之间保持一致,您可以使用视图来存储计算并隐藏复杂性。

3)添加额外的安全层

表可能会暴露大量数据,包括个人和银行信息等敏感数据。

通过使用视图和权限,您可以通过仅向用户公开必要的数据来限制用户可以访问的数据。

例如,表employees可能包含 SSN 和地址信息,这些信息只能由人力资源部门访问。

要向总务 (GA) 部门公开名字、姓氏和性别等一般信息,您可以根据这些列创建视图,并将 GA 部门的用户(而不是整个表employees授予该视图。

4) 启用向后兼容性

在遗留系统中,视图可以实现向后兼容性。

假设您想要将一个大表标准化为许多较小的表。并且您不想影响引用该表的当前应用程序。

在这种情况下,您可以根据新表创建一个与表同名的视图,以便所有应用程序都可以像引用表一样引用该视图。

请注意,视图和表不能同名,因此需要先删除表,然后再创建与已删除表同名的视图。

管理 MySQL 中的视图