MySQL 视图:如何使用示例从表中创建视图
MySQL 中的视图是什么?
视图是虚拟表,它们本身不存储任何数据,但显示其他表中存储的数据。换句话说,视图就是 SQL 查询。视图可以包含表中的所有行或部分行。MySQL 视图可以显示来自一个表或多个表的数据。
MySQL 视图语法
现在,我们来看看在 MySQL 中创建视图的基本语法。
CREATE VIEW `view_name` AS SELECT statement;
WHERE
- “CREATE VIEW `view_name`” 告诉 MySQL 服务器在名为 `view_name` 的数据库中创建一个视图对象。
- “AS SELECT statement” 是打包在 MySQL 视图中的 SQL 语句。它可以是包含来自一个表或多个表数据的 SELECT 语句。
如何在 MySQL 中创建视图
以下是在 MySQL 中创建视图的步骤:
第一步:使用“myflixdb”创建我们的第一个视图。
现在,我们将使用“myflixdb”创建我们的第一个视图。我们将创建一个简单的视图,限制成员表中可见的列。
假设授权要求规定,财务部门只能从成员表中查看成员编号、姓名和性别。要实现这一点,您可以创建一个视图:
CREATE VIEW `accounts_v_members` AS SELECT `membership_number`,`full_names`,`gender` FROM `members`;
第二步:展开视图节点。
在 MySQL workbench 中针对 myflixdb 执行上述脚本,并在数据库浏览器中展开视图节点,会得到以下结果。
请注意,accounts_v_members 对象现在在数据库视图对象中可见。
第三步:执行 SELECT 语句。
现在,让我们执行一个 SELECT 语句,该语句选择视图中的所有字段,如下面的 MySQL 创建视图示例所示。
SELECT * FROM `accounts_v_members`;
第四步:执行脚本。
在 MySQL workbench 中针对 myflixdb 执行上述脚本,会得到如下所示的结果。
membership_number | full_names | gender |
---|---|---|
1 | Janet Jones | Female |
2 | Janet Smith Jones | Female |
3 | Robert Phil | Male |
4 | Gloria Williams | Female |
5 | Leonard Hofstadter | Male |
6 | Sheldon Cooper | Male |
7 | Rajesh Koothrappali | Male |
8 | Leslie Winkle | Male |
9 | Howard Wolowitz | Male |
只返回了财务部门授权的列。成员表中存在的其他详细信息已被隐藏。
如果我们想查看构成特定视图的 SQL 语句,可以使用下面的脚本来实现:
SHOW CREATE VIEW `accounts_v_members`;
执行上述脚本将为您提供视图名称以及用于创建该视图的 SQL SELECT 语句。
MySQL 中的 JOIN 和视图
现在,让我们来看一个涉及多个表并使用 JOIN 的相当复杂的示例。
我们将打包 JOIN,该 JOIN 获取来自三个表(成员、电影和电影租赁)的信息。下面是帮助我们实现这一目标的脚本。
CREATE VIEW `general_v_movie_rentals` AS SELECT mb.`membership_number`,mb.`full_names`,mo.`title`,mr.`transaction_date`,mr.`return_date` FROM `movierentals` AS mr INNER JOIN `members` AS mb ON mr.`membership_number` = mb.`membership_number` INNER JOIN `movies` AS mo ON mr.`movie_id` = mo.`movie_id`;
执行上述脚本将在我们的 myflixdb 中创建名为 general_v_movie_rentals 的视图。
现在,让我们选择名为 general_v_movie_rentals 的表中的所有字段。
SELECT * FROM `general_v_movie_rentals`;
在 MySQL workbench 中针对 myflixdb 执行上述脚本,会得到如下所示的结果。
membership_number | full_names | title | transaction_date | return_date |
---|---|---|---|---|
1 | Janet Jones | Pirates of the Caribean 4 | 20-06-2012 | 28-06-2012 |
1 | Janet Jones | Forgetting Sarah Marshal | 22-06-2012 | 25-06-2012 |
3 | Robert Phil | Forgetting Sarah Marshal | 22-06-2012 | 25-06-2012 |
2 | Janet Smith Jones | Forgetting Sarah Marshal | 21-06-2012 | 24-06-2012 |
3 | Robert Phil | X-Men | 23-06-2012 | 28-06-2012 |
请注意,我们不必编写复杂的 JOIN 查询来获取有关成员、电影和电影租赁详细信息的信息。我们只需将视图用于常规的 SELECT 语句,就像对待任何其他普通表一样。该视图可以从运行在 myflixdb 之上的应用程序的任何地方调用。
删除 MySQL 中的视图
DROP 命令可用于从不再需要的 数据库中删除视图。删除视图的基本语法如下。
DROP VIEW ` general_v_movie_rentals `;
为什么要使用视图?
您主要可能出于以下 3 个原因使用视图:
- 最终,您将使用您的 SQL 知识来创建应用程序,这些应用程序将使用数据库来满足数据需求。建议您在应用程序中使用原始表结构的视图,而不是直接使用表本身。这可以确保在重构数据库时,您的旧代码将通过视图看到原始模式,而不会破坏应用程序。
- 视图提高了可重用性。您不必反复创建涉及 JOIN 的复杂查询。所有复杂性都转换为单行查询使用视图。这种精简的代码将更容易集成到您的应用程序中。这将消除输入错误的可能性,并且您的代码将更具可读性。
- 视图有助于数据安全。您可以使用视图仅向用户显示授权信息,并隐藏信用卡号等敏感数据。
摘要
- 视图是虚拟表;它们不包含返回的数据。数据存储在 SELECT 语句引用的表中。
- 视图通过向授权用户显示预期的数据来提高数据库的安全性。它们隐藏了敏感数据。
- 视图使生活更轻松,因为您不必一次又一次地编写复杂的查询。
- 可以使用 INSERT、UPDATE 和 DELETE 操作视图。这些操作将更改视图的底层表。唯一的考虑是视图应包含其引用的表的所有 NOT NULL 列。理想情况下,您不应使用视图进行更新。