目录
前言
数据库是由数据库设计员,根据用户的所有需求,按照数据库设计规范设计的,但根据数据库设计规范设计的数据库并不一定符合用户的应用需求。而 SQL SERVER根据不同用户的应用需求,重新定义了表的数据结果,这种结构就是视图。
数据库中的视图是一个虚拟表。同真实的表一样,视图包含一系列带有名称的列和行数据,行和列数据用来自由定义视图和查询所引用的表,并且在引用视图时动态产生。
一、视图的概述
1、视图的定义
视图是从一个或者多个表导出的,它的行为与表非常相似,但视图是一个虚拟表,在视图中可以使用SELECT语句查询数据,以及使用insert、update和delete语句修改记录,对于视图的操作最终转化为对基本数据表的操作。视图不仅可以方便操作,而且可以保障数据库系统的安全性。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表数据那样在数据库中在存储一份,通过视图看到的数据只是存放在基本表中的数据。可以对其进行增删该查,通过视图对数据修改,基本表数据也对应变化,反之亦然。
2、视图的优点
- 简单化:为用户集中数据,用户看到的就是需要的,简化用户的数据查询和理解。用户需要数据时,不必输入复杂的查询语句,只需要针对此视图做简单的查询即可。那些经常使用的查询可以被定义为视图,从而使得用户不必为以后的每次操作指定全部的条件。
- 安全化:对不同的用户定义不同的视图,使得用户只能看到与自己有关的数据,简化了用户权限的管理,增加了数据的安全性。
- 共享化:重新定制数据,使得数据便于共享。
- 逻辑数据独立性:视图可以帮助用户屏蔽真实表结构变化带来的影响。
3、视图的分类
SQL SERVER 中,视图可以分为 标准视图、索引视图 和分区视图。
- 标准试图:标准视图组合了一个或多个表中的数据,可以获得使用视图的大多数好处,可以实现对数据库的查询、修改和删除等基本操作。
- 索引视图:索引视图是被具体化了的视图,即它已经经过计算并存储。可以为视图创建索引,即对视图创建一个唯一的聚集索引。索引视图可以显著提高某些类型查询的性能,索引视图尤其适于聚合许多行的查询,但它们不太适于经常更新的基本数据集。
- 分区视图:分区视图在一台多多台服务器间水平连接一组成员表的分区数据,这样,数据看上去如同来自一个表。连接本地同一个SQL Server实例中的成员表的视图是一个本地区分视图。
4、视图和表的区别
- 视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化表,而表不是;
- 视图(除过索引视图)没有实际的物理记录,而基本表有;
- 表示内容,视图是窗口;
- 表占物理空间,而视图不占物理空间,视图只是逻辑概念的存在;
- 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全角度说,视图可以防止用户接触数据表,从而不知表结构;
- 表属于全局模式的表,是实表;视图数据局部模式的表,是虚表;
- 视图的建立和删除只影响视图本身,不影响对应的基本表。
二、视图的基本操作
1、创建视图
SQL SERVER 提供了 CREATE VIEW 命令来创建视图。
-- 语法格式
CREATE VIEW view_name
AS
SELECT column_name FROM table_name ... /* 定义视图的 SELECT语句 */
[ WITH CHECK OPTION ]
-- 定义视图的 SELECT语句:可以使用多个表或其它视图。
-- WITH CHECK OPTION:可选项,表示在执行所有数据修改语句时,都必须符合由 定义视图的 SELECT语句 设置的准则。
-- 示例:创建名为 s_c_sc 的视图,包括计算机专业的学生的学号、姓名,以及他们的选修课程号、课程名和成绩。
create view s_c_sc
as
select student.sno, sname, course.cno, cname, score
from student, sc, course
where student.specialty = '计算机' and student.sno = sc.sno and sc.cno = course.cno
go
-- 示例:创建名为 acc_count 的账户统计视图,求每个存户的账户个数,要求包括身份证号和姓名。
create view acc_count
as
select depositor.IDNO, Dname, count(*) as number
from depositor, account
where depositor.IDNO = account.IDNO
group by depositor.IDNO, Dname
go
2、修改视图
SQL SERVER 中,使用 ALTER VIEW 命令来修改视图。
-- 语法格式
ALTER VIEW view_name
AS
SELECT column_name FROM table_name ... /* 定义视图的 SELECT语句 */
[ WITH CHECK OPTION ]
-- 示例:修改视图 acc_count,求每个储户的账户个数和总存款余额,要求包括身份证和姓名。
alter view acc_count
as
select depositor.IDNO, Dname, count(*) as number, sum(balance) as sumbalance
from depositor, account
where depositor.IDNO = account.IDNO
group by depositor.IDNO, Dname
go
-- 示例:在视图上创建视图:创建 Few_Balance 余额统计视图,求总存款余额少于5000 的储户信息,包括身份证号码、姓名 和手机号。
create view Few_Balance
as
select depositor.IDNO, depositor.Dname, Telephone
from acc_count, depositor
where acc_count.IDNO = depositor.IDNO and SumBalance < 5000
go
注:视图的本质就是一张表,只是虚拟表而言,也可以使用视图跟表进行关联,就像表与表之间的关联一样。
3、操作视图
使用视图时,跟操作表一样,使用 SELECT、INSERT、UPDATE、DELETE 命令进行操作。
查看视图:
-- 示例:在视图 s_c_sc中,统计 C++ 语言课程的总分和平均分。
select sum(score) 总分, avg(score) 平均分
from s_c_sc
where cname = 'C++语言'
-- 示例:在视图 acc_count 中,查看储户李华的统计信息。
select * from acc_count
where Dname = '李华'
更新视图:
-- 示例:通过视图 male_view,向 student表中插入数据。
insert into view male_view
values
( '201501005', '张三' , '男', '1997-8-1', '2015-9-6', '电子信息', '2015级' )
-- 示例:如果希望用户不通过视图 male_vbu 插入女生信息,可以在创建视图时,使用 WITH CHECK OPTION 选项。
create view male_vbu
as
select sno, sname, ssex, birthday, en_time, specialty, grade
from student
where ssex = '男'
WITH CHECK OPTION
4、删除视图
在 SQL SERVER 中,删除视图使用 DROP VIEW 命令。
-- 语法格式
DROP VIEW 视图名称
-- 示例:删除视图 s_c_sc。
drop view s_c_sc
go
若有不足之处,欢迎各位大佬斧正。