视图实际上就是一个存储查询,重点是可以混合和匹配来自基本表(或其他视图)的数据,从而创建在很多方面象另一个普通表那样的起的作用。可以创建一个简单的查询,仅仅从一个表(另一个视图)选择几列或几行,而忽略其他行或列,或者也可以创建一个复杂查询。连接几个表查询,使得这些连接查询看起来更像一个表。
对视图的使用往往不是过多或者就是不够-很少是正好的。学完视图应当可以使用视图达到以下的目的:
1.为终端用户减少明显的数据复杂性。
2.防止敏感列被选择,但是仍然提供对其他数据访问。
3.给数据库添加额外的索引提高查询性能-甚至在没有使用索引所基于的视图也是如此。
视图基本语法:CREATE VIEW <view name> AS <select statement>.是不是看起来很简单。当然这上面的语法代表最简化的语法,对于大多数来说。已经够用了。扩展的语法如下:CREATE VIEW <view name> [WITH [ENCRYPTION][,] SCHMABINDING ][[,] VIEW_METADATA] AS <SELETE statement> [WITH CHECK OPTION][;]
下面将分别讲述上面代码每一分,但是先看下最简单的视图。极其简单视图。
use AdventureWorks --我们接着用AdventureWorks这个数据库 CREATE VIEW vw_ContactPhone --创建一个返回用户手机的视图
AS
SELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。 SELECT * FROM vw_ContactPhone --使用视图(看起来和查询表差不多)
创建视图没有真正的改变任何内容。只是通过了所访问数据过滤,这样做的好处是为终端用户减少数据复杂性,在现在的这个时代有大量工具是用户变得更简单。这看起来没有了不起的,但对于用户来说,的确减少减少复杂性。
注意:要意识到,在默认情况下,对于视图而言没有特别要做事情。视图就像命令行执行查询命令那样云信。没有任何预先优化的过程。这意味着在数据的请求和所交付数据之间提供额外一层系统开销,视图运行速度总是比直接运行内部的SELECT 语句要满。也就是说视图,视图的存在有一个理由,即对于用户而言是安全和简化的 。因此在需求和系统开销之间寻求平衡以适合特定的情况
使用过滤器视图:
SELECT * FROM vw_ContactPhone WHERE Phone LIKE '334%' --用上一个创建视图,查询区号开始是 %334的号码(10条结果)
使用更复杂的视图:管理人员希望简单查询了解客户订购了那些订单,这些订单订单顶过那些零件。以及那个帐号订购的。下面是创建一个执行非常简单查询的视图。
USE AdventureWorks
GO
CREATE VIEW vw_CustomerOrders
AS
SELECT sc.AccountNumber,soh.SalesOrderID,soh.OrderDate,sod.ProductID,pp.Name,sod.OrderQty,sod.UnitPrice,(sod.UnitPriceDiscount*sod.UnitPrice*sod.OrderQty) AS TatolDisCount,sod.LineTotal
FROM Sales.Customer AS sc
inner join Sales.SalesOrderHeader AS soh on sc.CustomerID=soh.CustomerID
Inner join Sales.SalesOrderDetail AS sod on soh.SalesOrderID=sod.SalesOrderID
inner join Production.Product as pp on sod.ProductID=pp.ProductID
不需要过多培训,管理人员都可以获取他们想要的数据了。
通过WITH CHECK OPTION 限制插入到视图中的内容。
WITH CHECK OPTION是sql server中鲜为人知功能之一。规则很简单-为了使用视图更新或者插入数据。结果必须符合以显示在视图结果中。重申一下,插入或者更新的行必须满足视图中SELECT 语句中使用WHERE 条件。不会针对到到基表限制。
USE panda
go
CREATE VIEW vw_test003
AS
select ID,OrderDate,name FROM dbo.test003
where test002ID between 4 and 6
with check option--命令已成功完成。where一定要,表示insert,delete,update 要满足的条件才能执行命令不会终止
--在测试下添加数据和更新数据会怎么样
select name from dbo.test003 where ID=7 --查询数据name=test update vw_test003 set name='panda_test' where ID=7 --(1 行受影响,test002ID=4)表示修改成功因为test002ID满足test002ID between 4 and 6 update vw_test003 set name='panda_test2' where ID=8 --(0条受影响)条件不满足where。
后面delete,insert看看 insert vw_test003 values(getdate(),'221');--消息 550,级别 16,状态 1,第 1 行
试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。
语句已终止。为什么呢?因为外键约束。我们改下视图。
ALTER VIEW vw_test003
AS
select ID,OrderDate,name,test002ID FROM dbo.test003
where test002ID between 4 and 6
with check option --修改完成
在添加数据,
insert vw_test003 values('2016-6-25','221',4);--(1条收影响表示成功)
DELETE 需要条件,并且满足条件
第一次查询的数据
执行几次后的数据
删除视图:DROP VIEW <view name>,[<view name>,<......,n>];
让视图和表一样,创建索引。只需要在AS前面加上:WITH SCHEMABINDING
CREATE VIEW vw_ContactPhoneIndex --创建一个可以建立索引返回用户手机的视图
WITH SCHEMABINDING
AS
SELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。
保护代码加密:只需要在AS前面加上:WITH ENCRYPTION,记得备份自己的数据。
CREATE VIEW vw_ContactPhoneEncry --创建一个加密引返回用户手机的视图
WITH ENCRYPTION
AS
SELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。。
GO
exec sp_helptext vw_ContactPhoneEncry --对象 'vw_ContactPhoneEncry' 的文本已加密。
SQL入门经典(六) 之视图的更多相关文章
-
SQL入门经典(十) 之事务
事务是什么?事务关键在与其原子性.原子性概念是指可以把一些事情当作一个执行单元来看待.从数据库角度看待.他是指应该全部执行或者全部不执行一条或多条语句的最小组合.当处理数据时候经常确保一件事发生另一件 ...
-
《SQL入门经典》总结
<SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...
-
SQL入门经典(一)之简介
今天是我第一天开通博客,也是我的第一篇博客.以后为大家带来第一篇关于学习技术性文章,这段时间会为大家带来是SQL入门学习.希望大家坚持读下去,因为学历有限.我也是初学者.语言表达能力不好和知识点不足, ...
-
sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)
第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的 DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...
-
SQL入门经典(八) 之存储过程
存储过程(stored procedure)有时候称为sproc,它是真正的脚本-或者更准确的说,他是批处理(batch)-它存储于数据库中,而不是淡出的文件中.无论如何,这个比较并不是很确定.存储过 ...
-
sql 入门经典(第五版) Ryan Stephens 学习笔记 第五部分: 性能调整
第十六章: 利用索引改善性能 1. create index 单字段索引: create index index_name on table_name (column_name);唯一索引: ...
-
sql 入门经典(第五版) Ryan Stephens 学习笔记 后续——存储引擎
一.引擎基础 1 查看系统支持的存储引擎 show engines; 2 查看表使用的存储引擎两种方法: a.show table status from database_name where na ...
-
SQL入门经典(七) 之脚本和批处理
什么是脚本.我们前面学的CREATE TABLE <table name> ,USE <database name>这些都是脚本,为什么用脚本.脚本存储到文件中并且可以重复利用 ...
-
SQL入门经典(五) 之键和约束
这一篇博客主要讲键的创建,约束的创建.修改对象和删除对象. 主键:主键是每行的唯一标识符,必须包含唯一值(因此不能为NULL).由于主键在关系中数据库的重要性,因此它是所有键和约束中最重要的.一个表最 ...
随机推荐
-
SDOI 2016 生成魔咒
题目大意:一个字符串,刚开始为空,依次在后面添加一个字符,问每次添加完字符后本质不同的字符串有多少种 后缀自动机裸题,添加字符时,更新的结点个数即为新增加的子串 #include<bits/st ...
-
Window环境下 Git 下载Android源码
1.需要的工具 git.vpn代理 2. 设置git代理(Google source 无法下载,git设置代理) git config --global http.proxy "localh ...
-
SQL基本语句(2)
使用Insert语句插入新数据 语法:INSERT [INTO] tbl_name [(col_name,...)] VALUES (pression,...),… INSERT [INTO] tbl ...
-
jAVA EE里什么是链式调用
链式调用就是每次调用完了过后返回的是自己,比如Hibernate里面执行hql需要设置参数时,每次设置完参数可以继续使用点设置下一个参数http://blog.sina.com.cn/s/blog_4 ...
-
Mybatis中的逆向工程
1. 准备工作 数据库驱动jar包, mybatis的jar包, 日志记录jar包 2. 配置文件 1. 在src的同级目录下配置generatorConfig.xml文件 <?xml vers ...
-
把json数据转换成集合
Sting MessageList="";JSONArray json = JSONArray.fromObject(MessageList);JSONObject object ...
-
Mysql phpStudy升级Mysql版本,流产了怎么办?
网上有一些phpStudy升级mysql的方法,如: https://www.cnblogs.com/GreenForestQuan/p/6496431.html 很不错,我的电脑一次成功,但是同事的 ...
-
vue.js及项目实战[笔记]— 01 vue.js
一. vue基础 1. 历史介绍 angular 09年,年份较早,一开始大家是拒绝的 react 2013年,用户体验较好,直接拉到一堆粉丝 vue 2014年,用户体验较好 前端框架与库的区别 j ...
-
149. Max Points on a Line (Array; Greedy)
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
-
Deepin 2015 安装后找不到win10 启动选项的解决办法
#sudo vi /boot/grub/grub.cfg 在export linux_gfx_mode后面加 menuentry "Windows 10 (loader)" --c ...