视图是指计算机数据库中的视图,是一个虚表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。
但是视图并不在数据库中以存储的数据值及形式存在。
行和列数据来自定义视图的源表,并且在引用视图时动态生成。
在关系型数据库中,索引是一种单独的、物理的、对数据库表中一列或多列的值进行排序的存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到相应的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。
数据库使用索引以找到特定值,然后根据指针找到包含这个值的数据行。
这样可以使对应于表的SQL语句执行速度更快。
在数据库的三级模式结构中,索引对应的是内模式部分,基本表对应的是模式部分,而视图对应的是外模式部分。
视图(View)是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制。
视图是一个虚拟表,并不表示任何物理数据,只是用来查看数据的窗口而已。
视图是从一个或几个表导出来的表,它实际上是一个查询结果,视图的名字和视图对表的查询存储在数据字典中。
在用户看来,视图是通过不同路径去看一个实际表,就像一个窗口,通过窗口去看外面的高楼,可以看到高楼的不同部分,而透过视图可以看到数据库中自己感兴趣的内容。
1. 视图概述
视图作为一种数据库对象,为用户提供了一个可以检索数据表中的数据的方式。
视图是一个虚表,可以视为另一种形式的表,是从一个或多个表中使用SELECT语句导出的虚拟表,那些用来导出视图的表称为基本表。
同基本表一样,视图包含一系列带有名称的列和行数据,其内容由查询所定义。
用户通过视图来浏览数据表中感兴趣的部分或全部数据,而数据的物理存储位置仍然在基本表中。
所以视图并不是以一组数据的形式存储在数据库中,数据库中只存储视图的定义,而不存储视图对应的数据,这些数据仍存储在导出视图的基本表中。
当基本表中的数据发生变化时,从视图中查询出的数据也随之改变。
视图中的数据行和列都来自基本表,是在视图被引用时动态生成的。
使用视图可以集中、简化和制定用户的数据库显示,用户可以通过视图来访问数据,而不必直接访问该视图的基本表。
视图的类型
SQL Server2019中,根据视图工作机制的不同,通常将视图分为标准视图、索引视图与分区视图三种类型。
(1) 标准实体(regular view)是一种虚拟表。
数据库中不保存视图数据集,只保存视图定义,其数据来源于一个或多个基本表的select查询,建立的目的是简化数据的操作。
标准视图是最常见的形式,一般情况下建立的视图都是标准视图。
(2) 索引视图(indexed view)是为提高聚合多行数据的视图性能而建立的一种带有索引的视图类型,索引视图数据集被物理存储在数据库中。
该类视图建立的目的是显著地提高检索的性能。
对于内容经常变更的基本表,不适合为其建立索引视图。
(3) 分区视图(distributed partitioned view)是一种特殊的视图,也称为分布式视图。
其数据来自一台或多台服务器中的分区数据。
分区视图屏蔽了不同物理数据源的差异性,使得视图中的数据仿佛来自同一个数据表。
当分区视图的分区数据来自己同一台服务器时,分区视图就成为本地分区视图。
视图的作用
视图一经定义以后,就可以像基本表一样被查询、修改、删除。
视图为查看和存取数据提供了另外一种途径。
对于查询完成的大多数操作,使用视图一样可以完成;
使用视图还可以简化数据操作;
当通过视图修改数据时,相应的基本表的数据也会发生变化;
同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
视图具有的作用如下:
- 以透明的方式操作数据库
- 集中而灵活地管理多源数据
- 提高数据的安全性
- 提高数据的共享性
- 重新组织数据,实现异源数据共享
2. 创建视图
视图在数据库中是作为一个对象来存储的。
创建视图前,要保证创建视图的用户已被数据库所有者授权使用create view语句,并且有权操作视图所涉及的表或其他视图。
在SQL Server2019中,创建视图可以在SSMS中进行,也可以使用create view 语句来实现。
创建视图需要注意的事项如下:
- 只能在当前数据库中创建视图
- 视图的名称必须遵循标识符的规则,且对每个用户必须是唯一的。此外,该名称不得与该用户拥有的任何表的名称相同。
- 如果视图引用的基本表或者视图被删除,则该视图不能再被使用,直到创建新的基本表或者视图。
- 如果视图中某一列是函数、数学表达式、常量或者与该视图中其他列是来自多个表的同名列,则必须为列定义名称。
- 不能在视图上创建全文索引,不能在规则、默认值、触发器的定义中引用视图。
- 视图可以嵌套定义,即视图的创建是基于其他的源视图。多层嵌套定义视图时,不能超过32层。
创建视图的方式主要有两种,分别是使用图形化界面和使用T-SQL语句。
使用图形化界面创建视图
在SSMS中使用图形化界面创建视图,是最快捷的创建方式,步骤如下。
第一步:
在”对象资源管理器”中展开要创建视图的数据库,展开”视图”选项,可以看到视图列表中系统自动为数据库创建的系统视图。
右击”视图”选项,在弹出的快捷菜单中选择”新建视图”命令,打开”添加表”对话框,在此对话框中,可以选择视图、函数等,然后添加要用到的表,如下图:
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-42.png)
第二步:
选择对应的表后,可勾选所有列,选中需要组成视图的表和对应列后,可以看到系统自动生产的T-SQL语句,如下图所示,最后进行保存即可
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-43-1024x765.png)
使用T-SQL语句创建视图
创建视图只能在当前数据库中进行。
创建视图时,SQL Serever会自动检验视图定义中引用的对象是否存在。
使用create view语句创建视图的语法格式如下:
CREATE VIEW view_name[(column[,..n]
[with encryption]
AS
select_statement
[with check option]
其中,各参数说明如下:
- view_name:视图的名称。视图名称必须符合有关标识符的规则。
- column:视图中列明。如果未指定列名,则视图列将获得与select语句中的列相同的名称。
- with encryption:对create view 语句的定义文本进行加密。
- select_statement:定义视图的select语句。该语句可使用多个表和其他视图。
- with check option:强制针对视图执行的所有数据修改语句都必须符合在select_statement中设置的条件。
只有在下列情况下才必须命名create view子句中的列名:
- 列是从算术表达式、函数或常量派生的。
- 两个或更多的列可能会具有相同的名称,视图中的某列被赋予了不同于派生来源列的名称,也可以在select语句中指定列名。
对于定义视图的select语句,有以下若干限制:
- 定义视图的select语句,有以下若干限制
- 不能在临时表或表变量上定义视图
创建V_StuInfo视图,包括学号、姓名、性别、年龄等信息
CREATE VIEW V_StuInfo
AS
SELECT ID,NAME,SEX,AGE FROM STUDENT
运行结果如下图所示:
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-44.png)
在创建视图前,建议首先测试select语句是否能正确执行,测试成功后,再创建视图。
使用V_StuInfo视图查看学生信息
SELECT * FROM V_StuInfo
运行结果如下图所示:
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-45.png)
3. 修改视图
修改视图的方式主要有两种,分别是使用图形化界面和使用T-SQL语句。
使用图形化界面修改视图
使用图形化界面进行视图的修改,操作步骤如下:
利用SSMS展开”视图”选项,右击要修改的视图,在弹出的快捷菜单中选择”设计”命令,在打开的对话框中对视图进行修改
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-47.png)
打开视图的”设计”界面后,修改的过程和创建视图的过程是一致的。
使用T-SQL语句修改视图
使用T-SQL语句修改视图的语法格式如下:
ALTER VIEW view_name[(column[,..n]
[with encryption]
AS
select_statement
[with check option]
其中,各参数的含义同CREATE VIEW语句。
修改视图V_StuInfo,使其只显示女同学的学号、姓名、性别、年龄信息。
ALTER VIEW V_StuInfo
as
SELECT id,name,sex,age FROM STUDENT where SEX='女'
运行结果如下图所示:
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-48.png)
4. 查看视图
SQL Server允许用户查看视图的一些信息,如视图的基本信息、定义信息、与其他对象间的依赖关系等。
这些信息可以通过相应的存储过程来查看。
查看视图的基本信息
可以使用系统存储过程sp_help来显示视图的名称、所有者、创建日期、列信息、参数等。
其语法格式如下:
[execute]sp_help view_name
其中,execute可以简写为exec或省略。
举例:查看视图V_StuInfo的基本信息
exec sp_help V_StuInfo
运行结果如下图所示:
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-49-1024x722.png)
查看视图的定义信息
如果视图在创建时没有加密,即创建视图没有选择with encryption,则可以使用系统存储过程sp_helptext显示视图的定义信息。
其语法格式如下:
[execute]sp_heletext view_name
举例:查看视图V_StuInfo的定义文本
exec sp_helptext V_StuInfo
运行结果如下图所示:
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-50.png)
查看视图与其他对象间的依赖关系
使用系统存储过程sp_depends查看视图与其他对象间的依赖关系,如视图中引用了哪些表中的哪些字段等。
其语法格式如下:
[execute]sp_depends view_name
举例:查看视图V_StuInfo所依赖的对象
exec sp_depends V_StuInfo
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-51.png)
5. 使用视图
视图创建完毕,就可以像查询基本表一样通过视图查询所需要的数据。
而且有些查询需要的数据直接从视图中获取比从基本表中获取数据要简单,也可以通过视图修改基本表中的数据。
修改视图的数据,其实就算对基本表中的数据进行修改,因为真正存储数据的地方是基本表,而不是视图,同样通过insert、update、delete语句来完成。
但是在利用视图更新数据的时候也要注意一些事项,并不是所有的视图都可以进行数据更新,只有对满足可更新条件的视图才能进行数据更新。
- 任何通过视图的数据更新(Insert、Update、Delete)都只能引用一个基本表中的列
- 如果视图中数据为一个表的行、列子集,则此视图可执行Insert、Update、Delete语句;但如果视图中没有包含表中某个不允许取空值又没有默认值约束的列,则不能利用视图插入数据
- 如果视图所依赖的基本表有多个时,不能向视图添加数据
- 如果视图所依赖的基本表有多个时,那么一次修改只能修改一个基本表中的数据
- 如果视图所依赖的基本表有多个时,那么不能通过视图删除数据
- 通常有可能插入并不满足视图查询的Where子句条件的一行。为了限制此操作,可以在创建视图时使用with check option选项。
- 视图中被修改的列必须直接引用表列中的基础数据,不能是通过任何其他方式对表中的列进行派生而来的数据,如聚合函数、计算等
- 被修改的列不应在创建视图时受group by 、having、distinct或top子句影响。
6. 删除视图
可以使用drop view 语句完成删除视图的功能,它的语法格式如下:
drop view view_name[,...n]
其中,drop view 语句一次能够删除一个或多个视图,只需在要删除的视图名称之间用逗号隔开即可。
例子:删除V_StuInfo
USE ichi
GO
DROP VIEW V_StuInfo
运行结果如下图:
![](https://ichiblog.cn/wp-content/uploads/2024/09/图片-52.png)