概述

视图(虚拟表)是 SQL 中的一个重要概念,在本文中我们将会介绍在关系型数据库中如何使用视图。
image.png
从上图可以看出,虚拟表的创建连接了一个或多个数据表,不同的查询应用都可以建立在虚拟表之上。

视图的操作

视图作为一张虚拟表,帮我们封装了底层与数据表的接口。它相当于是一张表或多张表的数据结果集。
因此,视图可以帮助我们简化复杂的 SQL 查询,比如在编写视图后,我们就可以直接重用它,而不需要考虑视图中包含的基础查询的细节。同样,我们也可以根据需要更改数据格式,返回与底层数据表格式不同的数据。
通常情况下,小型项目的数据库可以不使用视图,但是在大型项目中,以及数据表比较复杂的情况下,视图的价值就凸显出来了,它可以帮助我们把经常查询的结果集放到虚拟表中,提升使用效率。

创建视图

创建视图的基本语法如下:

  1. CREATE VIEW view_name AS
  2. SELECT column1, column2
  3. FROM table
  4. WHERE condition

实际上就是我们在 SQL 查询语句的基础上封装了视图 VIEW,这样就会基于 SQL 语句的结果集形成一张虚拟表。
其中 view_name 为视图名称,column1、column2 代表列名,condition 代表查询过滤条件。
我们以 NBA 球员数据表为例。我们想要查询比 NBA 球员平均身高高的球员都有哪些,显示他们的球员 ID 和身高。那么,我们就可以创建一个 player_above_avg_height 视图:

  1. CREATE VIEW player_above_avg_height AS
  2. SELECT player_id, height
  3. FROM player
  4. WHERE height > (SELECT AVG(height) from player)

接下来,我们就可以直接从视图中进行数据查询了:
image.png

嵌套视图

当我们创建好一张视图之后,还可以在它的基础上继续创建视图,也就称之为嵌套视图。
比如我们想在虚拟表 player_above_avg_height 的基础上,找到比这个表中的球员平均身高高的球员,作为新的视图 player_above_above_avg_height,那么可以写成:

  1. CREATE VIEW player_above_above_avg_height AS
  2. SELECT player_id, height
  3. FROM player
  4. WHERE height > (SELECT AVG(height) from player_above_avg_height)

修改视图

修改视图的语法是:

  1. ALTER VIEW view_name AS
  2. SELECT column1, column2
  3. FROM table
  4. WHERE condition

它的语法和创建视图一样,只是对原有视图的更新。比如我们想更新视图 player_above_avg_height,增加一个 player_name 字段,可以写成:

  1. ALTER VIEW player_above_avg_height AS
  2. SELECT player_id, player_name, height
  3. FROM player
  4. WHERE height > (SELECT AVG(height) from player)

删除视图

删除视图的语法非常简单:

  1. DROP VIEW view_name

PS:SQLite 不支持视图的修改,仅支持只读视图,也就是说你只能使用 CREATE VIEW 和 DROP VIEW,如果想要修改视图,就需要先 DROP 然后再 CREATE。

视图的用途

视图可以对 SELECT 语句进行了封装,方便我们重用它们。那么,基于视图,我们通常可以完成如下工作:

  • 利用视图完成复杂的连接查询;
  • 利用视图对数据进行格式化;
  • 使用视图进行字段加工计算;
  • 提升安全性,在使用视图时,一般不会轻易通过视图对底层数据进行修改,即使是使用单表的视图,也会受到限制,比如计算字段,类型转换等是无法通过视图来对底层数据进行修改的,这也在一定程度上保证了数据表的数据安全性。