sql入门经典之视图

AIの海雅 AIの海雅     2022-07-28     649

关键词:

视图实际上就是一个存储查询,重点是可以混合和匹配来自基本表(或其他视图)的数据,从而创建在很多方面象另一个普通表那样的起的作用。可以创建一个简单的查询,仅仅从一个表(另一个视图)选择几列或几行,而忽略其他行或列,或者也可以创建一个复杂查询。连接几个表查询,使得这些连接查询看起来更像一个表。

对视图的使用往往不是过多或者就是不够-很少是正好的。学完视图应当可以使用视图达到以下的目的:

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入门经典之连接查询

上一篇介绍到查询。这一篇主要讲连接查询,将介绍INNERJOIN,OUTERJOIN(LEFT和RIGHT),FULLJOIN,CROSSJOIN。连接顾名斯义就是把多个数据表数据合并到一个结果集。用内部连接检索匹配的数据(innerjoin)连接结构语法如下:SELECT<columnlist>... 查看详情

sql入门经典之存储过程

存储过程(storedprocedure)有时候称为sproc,它是真正的脚本-或者更准确的说,他是批处理(batch)-它存储于数据库中,而不是淡出的文件中。无论如何,这个比较并不是很确定。存储过程有输出参数,输入参数已及返回值等。而脚本... 查看详情

sql入门经典之事务

事务是什么?事务关键在与其原子性。原子性概念是指可以把一些事情当作一个执行单元来看待。从数据库角度看待。他是指应该全部执行或者全部不执行一条或多条语句的最小组合。当处理数据时候经常确保一件事发生另一件... 查看详情

sql入门经典之自定义函数

UDF和存储过程很类似,用户自定义函数是一组有序的T-SQL语句,这些语句被预先优化和编译,并且可以作为一个单元来测试调用。UDF和存储过程的主要区别在于结果返回方式,为了能支持更多返回值,UDF比存储过程有跟多限制。U... 查看详情

sql入门经典之脚本和批处理

什么是脚本。我们前面学的CREATETABLE<tablename>,USE<databasename>这些都是脚本,为什么用脚本。脚本存储到文件中并且可以重复利用和提取的文件。创建变量:DECLARE语句最常用的语法:DECLARE@<variablename><variabletype>[=va... 查看详情

sql入门经典之创建和修改数据表

本章主要讲如何使用脚本创建数据库;如何使用脚本创建表;如何删除对象和修改对象.CREATE语句:CREATE<objecttype><onjectname>创建数据库基本语法:CREATEDATABASE<databasename>ON[PARIMARY]([NAME=<‘logicalfilename‘>,][FILENAME=‘&... 查看详情

sql入门经典之数据库基本查询添加更新和删除

使用SQL查询:SQL查询基本语法:SELECT[ALL|DISTINCT] [TOP(<expression>)[PERCENT][WITHTIES]]<columnlist>[FROM<sourcetable(s)/view>][WHERE<restrictivecondition>][GROUDBY<columnnameorex 查看详情

sql入门经典之键和约束

这一篇博客主要讲键的创建,约束的创建。修改对象和删除对象。主键:主键是每行的唯一标识符,必须包含唯一值(因此不能为NULL)。由于主键在关系中数据库的重要性,因此它是所有键和约束中最重要的。一个表最多可以... 查看详情

javascript入门经典(第五版)-清华出版社之“经典”错误

学校教材太烂,于是自己买书。果然是入门经典,开篇就把我惊着了~第九页≯1.4/ch1_example2.html/1<script>2//scriptblock23documentbgcolor="red";4alert("Secondscriptblock");5</script>运行不通过,仔细检查发现1documentbgcolor应为document.bgColor 查看详情

《算法竞赛入门经典》之“算法设计与优化策略”

一。构造法UVA120 StacksofFlapjacksTimeLimit: 3000MS  64bitIOFormat: %lld&%lluSubmit Status uDebugDescriptionBackgroundStacksandQueuesareoftenconsideredthebreadandbutt 查看详情

sql之经典sql语句大全

经典SQL语句大全一、基础1、说明:创建数据库CREATEDATABASEdatabase-name 2、说明:删除数据库dropdatabasedbname3、说明:备份sqlserver--- 创建备份数据的 deviceUSEmasterEXECsp_addumpdevice‘disk‘,‘testBack‘,‘c:mssql7backupMyNwind_1 查看详情

dfs与dp算法之关系与经典入门例题(代码片段)

目录声明dfs与dp的关系经典例题-数字三角形-POJ1163题目dfs思路解题思路具体代码dp思路解题思路具体代码声明本文不介绍dfs、dp算法的基础思路,有想了解的可以自己找资源学习。本文适合于刚刚接触dfs和dp算法的人,发现两种算... 查看详情

sql入门篇之什么是别名?

SQL入门篇之什么是别名?    查看详情

django入门系列之(视图层)(代码片段)

本文目录1视图函数2HttpRequest对象3HttpResponse对象 4JsonResponse5CBV和FBV6简单文件上传回到目录1视图函数一个视图函数,简称视图,是一个简单的Python函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重... 查看详情

经典sql之连续3天登陆(代码片段)

经典SQL1——连续3天登陆无论大厂还是小厂,在SQL题面试中,面试官都很喜欢问连续3天登陆,那么今天就来手撕一下建表在Hive中简单建表droptableifexistsuser_login_details_last_3_day;createtableuser_login_details_last_3_day(Useridint,login_... 查看详情

django框架入门之视图和url模板(代码片段)

视图和URL站点管理页面做好了,接下来就要做公共访问的页面了.对于Django的设计框架MVT.用户在URL中请求的是视图.视图接收请求后进行处理.并将处理的结果返回给请求者.使用视图时需要进行两步操作1.定义视图2.配置URLconf1.定义... 查看详情

python入门之经典函数实例——第2关:lambda函数-匿名函数的使用(代码片段)

任务描述在Python编程中我们除了可以用def语句来定义函数之外,还可以使用lambda来定义。我们用def语句来定义函数时需要指定函数名字,而使用lambda来定义函数时则不需要。lambda函数是Python中一个非常独特的函数类型ÿ... 查看详情

python入门之经典函数实例——第1关:递归函数-汉诺塔的魅力(代码片段)

任务描述在Python函数内部,我们可以去调用其他函数。所以如果一个函数在内部调用自身,这个函数我们就称为递归函数。本关我们将以汉诺塔的例子来感受递归函数的方法与应用。汉诺塔问题源于印度一个古老传说。... 查看详情