视图的定义
视图(View)是一种虚拟的表,其结构和数据来自于一个或多个基本表,可以被当作普通表一样进行查询操作,但实际上不存储任何数据。在数据库中,视图可以被看作是一种数据访问的方式,它可以隐藏底层表的复杂性,提供简洁易懂的数据访问接口,方便用户进行查询、分析和报表等操作。
视图的作用
视图的作用主要有以下几个方面:
- 简化查询操作:通过创建视图,可以将多个表的数据组合成一个逻辑上的整体,减少了用户在查询时需要编写复杂的 SQL 语句。
- 隐藏复杂性:数据库中有时候存在多个关联表,为了查询这些表的数据需要编写复杂的 SQL 语句,使用视图可以将这些关联表的查询逻辑隐藏起来,简化了用户对数据库的操作。
- 提高数据安全性:视图可以对底层表进行过滤和限制访问,可以对用户提供必要的访问权限,可以保护数据的隐私和安全。
- 减少数据冗余:有时候需要将数据多次查询,这样容易导致数据冗余,使用视图可以避免这种情况的发生,同时可以减少网络流量和提高数据访问效率。
举例说明
这里给你举一个具体的例子,假设我们有一个电子商务网站,有以下两个表:
- 商品表:包含商品ID、名称、价格等信息;
- 订单表:包含订单ID、购买者ID、购买时间等信息。
现在我们需要查询用户最近购买的商品名称和价格,如果不使用视图,可能需要编写如下的 SQL 语句:
上述 SQL 语句涉及两个表的联合查询、排序和限制,对于一些不熟悉 SQL 的用户来说,可能很难理解。但是,如果我们创建一个名为“recent_orders”的视图,用于展示最近订单的详细信息,查询用户最近购买的商品名称和价格,就变得非常简单了:
上述 SQL 语句非常简单,只需要查询“recent_orders”视图即可,无需关心视图背后的复杂查询逻辑,这样就可以提高代码的可读性和维护性。另外,视图还可以对底层表进行过滤和限制访问,可以保护数据的隐私和安全,对于电商网站这种需要保护用户隐私的应用来说,非常重要.
创建视图
下面以上面提到的例子为例,创建一个名为“recent_orders”的视图,代码如下:
上述代码创建了一个名为“recent_orders”的视图,其查询逻辑为:查询“goods”表和“order_details”表,返回商品名称、价格、购买者ID和购买时间等信息。通过创建这个视图,我们可以方便地查询用户最近购买的商品名称和价格,而不需要编写复杂的 SQL 语句。
需要注意的是,视图只是一个虚拟表,不存储任何数据,其查询结果实际上是通过查询底层表获得的。因此,在创建视图时需要确保底层表的结构和数据都是正确的,否则查询结果可能会出现问题。此外,由于视图是基于底层表的查询逻辑生成的,其性能可能会受到底层表的影响,因此在创建视图时需要仔细考虑其查询效率和性能影响。
为什么说创建视图查询会提高查询性能?
如果将上面这个例子改成一个需要联表查询的视图,那么使用视图的优势就会更加明显。例如,我们可以创建一个名为“recent_orders_with_goods”的视图,其查询逻辑为:查询最近订单的详细信息,并联合查询对应的商品信息。这样,我们就可以在一个简单的查询语句中获得最近订单和对应的商品信息,而无需编写复杂的 SQL 语句。示例代码如下:
在查询“recent_orders_with_goods”视图时,只需要编写一个简单的 SQL 查询语句,就可以获取最近订单和对应的商品信息:
对于这种需要联表查询的场景,使用视图的优势就体现出来了。通过将多个表的关联逻辑封装到一个视图中,我们可以简化查询语句,并提高查询效率。视图还可以通过使用索引、分区等技术进一步优化查询效率,因此对于复杂的查询场景,使用视图是非常有益的。
具体说下视图为什么可以提高查询效率?
当我们使用视图查询时,数据库系统会先将视图的查询逻辑转换为底层表的查询逻辑,然后再执行查询。这样,我们就可以在查询时使用已经优化过的查询逻辑,而无需重复编写和优化查询逻辑,从而提高查询效率。
此外,使用视图还可以通过使用索引、分区等技术进一步优化查询效率。例如,我们可以在视图中使用索引来加速查询,或者将视图分区以提高查询效率。这些优化措施可以提高查询效率,并且不会对代码的可读性和维护性造成太大的影响。
视图的更新及维护
当视图需要更新时,通常有以下情况:
- 视图查询语句需要更新:视图的定义是基于查询语句构建的,如果查询语句需要修改,那么视图的定义也需要更新。
- 表结构变化:当视图所基于的表结构发生变化时,例如新增、删除、修改列,需要更新视图定义。
- 数据变化:当视图所基于的数据发生变化时,例如数据被删除、修改、新增,需要更新视图定义。
在 SQL 中,使用 CREATE VIEW 语句可以创建一个视图。如果视图已经存在,使用 CREATE VIEW 语句会导致一个错误。为了避免这种情况,可以使用 OR REPLACE 关键字。
OR REPLACE 关键字的作用是:如果视图已经存在,那么会用新的定义来替换原有的视图;如果视图不存在,那么就创建一个新的视图。
下面是一个使用 OR REPLACE 关键字更新视图的示例 SQL 语句:
在这个例子中,如果 my_view 已经存在,那么该语句将使用新的 SELECT 语句来替换原有的视图定义;如果 my_view 不存在,那么该语句将创建一个新的视图。
更多分享在微信公众号:老程序员刘飞