源栈培训:数据库:12-视图

更多
2019年04月03日 15点03分 作者:叶飞 修改
定义和特点

根据查询(SELECT)语句计算或整理出来的虚拟表(属于表表达式(Table Expression)

持久化在数据库中(和“派生表”“公用表达式(CTE)”的区别),只要不显式删除,就可以重复使用(和临时表的区别


标准视图

存储的是SELECT语句,而不是实际的物理数据。数据行和列来自于“基表(和其他视图)”,每一次使用时动态生成

CREATE VIEW view_name[(column_1, column_2, column_3, ...)]
AS
SELECT clause

列名可以在view_name之后指定;如果不指定,就使用SELECT clause里面的列名

尽量不要使用SELECT * FROM...,因为修改基表的定义或增加列,不会自动刷新到已创建的视图 (EXEC sp_refreshview view_name)

所有列(包括:计算列)都必须有不同的列名

不同使用ORDER BY,除非是为了TOP


增删改查

可以就视图进行增删改查,其结果会反映到基表上;反之亦然。

但只能修改直接引用的列,派生列(计算得到的列)不能被修改:

  • 聚合函数
  • GROUP BY/HAVING/DISTINCT
  • 经表达式计算
  • UNION

当视图是JOIN语句构成时:

  • 要当心“影响扩大”
  • 不能同时影响多个基表

注意:VIEW和基表之间同步的只是“数据”,不是“结构”

代码演示


视图选项(option)

ENCRYPTION:文本加密(聊胜于无)。

EXEC sp_helptext 'VBigProblem'  -- 还可以查看存储过程/自定义函数/触发器等

SCHEMABINDING:不允许删除基表对象或者修改被引用的列。两个语法要求:

  1. 所有表/视图对象都必须使用:两部分名称(schema.object,如:dbo.TProblem)
  2. 不能SELECT *

CHECK OPTION:演示:通过INSERT view插入一条在视图永远查找不到的数据


修改VIEW结构

ALTER VIEW view_name[(column_1, column_2, column_3, ...)]
AS
SELECT clause

注意:

只能使用SELECT语句,没有ADD COLUMN之类的语法

修改视图名称和列名可使用系统存储过程sp_rename

EXEC sp_rename 'view_name.old_column_name', 'new_column_name', 'column'  -- 修改列名
EXEC sp_rename 'old_viewname', 'new_viewname', 'object'                  -- 修改表名


删除视图

DROP VIEW v_name_1, [v_name_2] ,[v_name_3]...   -- 可以一次性删除多个视图


索引视图

创建了唯一聚集索引的视图:性能增强。

视图的结果集会被持久化:避免反复生成,仍然是为了增强性能(类似于cache)。

每一次对基表的修改,都会重新修改索引视图:无法避免的代价 —— 从来没有免费的午餐

创建索引视图应满足的条件:

  • 只能基于表(不能基于其他视图)
  • 必须设置 WITH SCHEMABINDING
  • 聚合函数的列必须是NOT NULL值,使用聚集函数就必须在选择列表中添加BIG_COUNT(*)
  • 第一个索引必须是 UNIQUE CLUSTERED(之后可以添加其他索引)
  • ......

演示:

  • 性能增强
  • 使用索引视图实现除NULL值以外的唯一约束


作业

  1. 创建求助的应答表 TResponse(Id, Content, AuthorId, ProblemId, CreateTime)
  2. 然后生成一个视图VResponse(ResponseId, Content, AuthorId, AuthorName, ProblemId, ProblemTitle, CreateTime),要求该视图:
    • 能展示应答作者的用户名、应答对应求助的标题和作者用户名
    • 只显示求助悬赏值大于5的数据
    • 已被加密
    • 保证其使用的基表结构无法更改
  3. 演示:在VResponse中插入一条数据,却不能在视图中显示
  4. 修改VResponse,让其能避免上述情形
  5. 创建视图VProblemKeyword(ProblemId, ProblemTitle, ProblemReward, KeywordAmount),要求该视图:
    • 能反映求助的标题、使用关键字数量和悬赏
    • 在ProblemId上有一个唯一聚集索引
    • 在ProblemReward上有一个非聚集索引
  6. 在基表中插入/删除数据,观察VProblemKeyword是否相应的发生变化


源栈 数据库 SQL 视图
赞: 6 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0
叶飞的系列文章

源栈培训:ASP.NET全栈开发

飞哥的源栈培训:线上全程直播,免费收看;线下拎包入住,按周计费。本系列收录所有讲义(含视频录播地址)

编程那些事:菜鸟入门

大飞哥倾力之作,面向有意入行IT/开发/编程的初学者,欢迎任何形式的留言建议……

从包工头到程序猿

真实故事,讲述我在家装公司关门之后,如何转行成为一个程序猿的故事。(《折腾》第三卷)

《折腾》(卷一)青涩

时间段:从大学毕业到开始创业。离开青葱校园,涉世之初的那些往事……

《折腾》(卷二)风雨 之(1)工地

我一个完全的门外汉(无论装修还是管理),开始给黎叔装修房子。从踌躅满志,到四处碰壁;从一往直前,到左右为难……

《折腾》(卷二)风雨 之(2)胸怀

作为一个律师,接工程没签合同,被狠狠的坑了一把!年轻人暴烈的想要复仇,黎叔教他一个企业家的胸怀……

《折腾》(卷二)风雨 之(3)渠道

成立了公司,招聘了员工,开始大力的拓展业务,一个接一个的坑,摔倒了又爬起来……

《折腾》(卷二)风雨 之(4)视野

经历残酷现实的磨砺,终于明白:干啥事,都不能闭门造车,人要走出去,开阔视野……

未分类

系统自动生成的未分类系列

一锅大杂烩

从律师到包工头,从码农到写手,读书交友生活创业,各种零零碎碎,乱七八糟……

人人都是程序猿

计算机编程普及课程,视频:https://space.bilibili.com/55410301/#/channel/detail?cid=49491

全部
关键字



帮助

反馈