视图是什么?
https://zhidao.baidu.com/question/17425476.html
视图:
在SQL中,视图是外模式一级数据结构的基本单位。 它是从一个或几个基本表中导出的 表,是从现有基本表中抽取若干子集组成用户的“专用表”。
基本表:
基本表的定义指建立基本关系模式, 而变更则是指对数据库中已存在的基本表进行删除与修改。
区别:
1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间, 视图只是逻辑概念的存在,表可以及时四对它进行修改, 但视图只能有创建的语句来修改
5、表是内模式,试图是外模式
6、视图是查看数据表的一种方法, 可以查询数据表中某些字段构成的数据, 只是一些SQL语句的集合。从安全的角度说, 视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表, 是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
联系:
视图(view)是在基本表之上建立的表,它的结构( 即所定义的列)和内容(即所有数据行)都来自基本表, 它依据基本表存在而存在。一个视图可以对应一个基本表, 也可以对应多个基本表。 视图是基本表的抽象和在逻辑意义上建立的新关系
以前都是直接操作数据库中表,现在是存储一个视图(sql语句)来间接操作数据库。
下一篇:视图的创建、更改、删除,视图中内容的查询、插入、更新、删除。
一、视图的创建、更改、删除
1、创建
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[View_View_PlotYearPlan]
AS
SELECT
SELECT PlotID + '_' + CAST(DataVersion AS varchar) + '_' + SettlePlotName AS ID, PlotID, DataVersion, ModifyDesc, SettlePlotName, SettlePlotName AS Name, 用地面积, 容积率, 节地率, 规划住宅套数,
地块内原有农用地面积, 地块内原有动迁农民户数, 地块开工日期, 规划住宅建筑面积
注解:
1、将查询sql语句作成 “视图”,下次需要使用时直接查询视图中内容。
2、PlotID + '_' + CAST(DataVersion AS varchar) + '_' + SettlePlotName AS ID
多个数据拼接成一个新的 ID。
CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型。
http://www.studyofnet.com/news/109.html
3、还可以将多张表的连接查询、表和视图的链接查询 语句 作成一个“视图”。
2、更改
ALTER VIEW [dbo].[View_SettlePlot]
AS
SELECT PlotID + '_' + CAST(DataVersion AS varchar) + '_' + SettlePlotName AS ID, PlotID, DataVersion, ModifyDesc, SettlePlotName, SettlePlotName AS Name, 用地面积, 容积率, 节地率, 规划住宅套数,
地块内原有农用地面积, 地块内原有动迁农民户数, 地块开工日期, 规划住宅建筑面积
FROM dbo.SettlePlot
注解:
修改其中的sql语句即可。
3、删除
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[View_SettlePlot]'))
DROP VIEW [dbo].[View_SettlePlot]
二、视图中内容的查询、插入、更新、删除。
1.查询
SELECT [ID]
,[PlotID]
,[DataVersion]
,[ModifyDesc]
,[SettlePlotName]
,[Name]
,[用地面积]
,[容积率]
,[节地率]
,[规划住宅套数]
,[地块内原有农用地面积]
,[地块内原有动迁农民户数]
,[地块开工日期]
,[规划住宅建筑面积]
FROM [CR].[dbo].[View_SettlePlot]
GO
2、插入
INSERT INTO [CR].[dbo].[View_SettlePlot]
([ID]
,[PlotID]
,[DataVersion]
,[ModifyDesc]
,[SettlePlotName]
,[Name]
,[用地面积]
,[容积率]
,[节地率]
,[规划住宅套数]
,[地块内原有农用地面积]
,[地块内原有动迁农民户数]
,[地块开工日期]
,[规划住宅建筑面积])
VALUES
(<ID, nvarchar(140),>
,<PlotID, nvarchar(8),>
,<DataVersion, smallint,>
,<ModifyDesc, nvarchar(1000),>
,<SettlePlotName, nvarchar(100),>
,<Name, nvarchar(100),>
,<用地面积, float,>
,<容积率, float,>
,<节地率, float,>
,<规划住宅套数, int,>
,<地块内原有农用地面积, float,>
,<地块内原有动迁农民户数, int,>
,<地块开工日期, datetime,>
,<规划住宅建筑面积, float,>)
3、更新
UPDATE [CR].[dbo].[View_SettlePlot]
SET [ID] = <ID, nvarchar(140),>
,[PlotID] = <PlotID, nvarchar(8),>
,[DataVersion] = <DataVersion, smallint,>
,[ModifyDesc] = <ModifyDesc, nvarchar(1000),>
,[SettlePlotName] = <SettlePlotName, nvarchar(100),>
,[Name] = <Name, nvarchar(100),>
,[用地面积] = <用地面积, float,>
,[容积率] = <容积率, float,>
,[节地率] = <节地率, float,>
,[规划住宅套数] = <规划住宅套数, int,>
,[地块内原有农用地面积] = <地块内原有农用地面积, float,>
,[地块内原有动迁农民户数] = <地块内原有动迁农民户数, int,>
,[地块开工日期] = <地块开工日期, datetime,>
,[规划住宅建筑面积] = <规划住宅建筑面积, float,>
WHERE <搜索条件,,>
4、删除
DELETE FROM [CR].[dbo].[View_SettlePlot]
WHERE <搜索条件,,>
三、视图中内容 插入、更新、删除 的限制条件。
http://bbs.csdn.net/topics/390809240
1、插入记录
通过视图插入数据与直接向表中插入数据一样,但通过视图插入数据时引用的字段为视图中的字段,和表中字段不一定完全相同,故有如下规则:
1)使用插入语句的用户必须拥有在基本表中插入数据的权限。
2)若视图中未包括基表中属性为NOT NULL的字段时,操作失败。
3)若基表中的字段因规则或约束而不接受,从视图插入的数据操作失败。
4)若视图中包含有统计函数结果或多个字段值的组合,操作失败。
5)若视图中使用了distinct,group by短句,操作失败。
6)若视图中使用with check option,则操作失败。因为插入新记录时,即使该记录不满足创建视图时定义的限制条件,仍然可以向表中插入数据记录,但通过视图查询数据时不会显示出新插入的记录。若想防止插入不符合视图定义的数据可使用WITH CHECK OPTION选项来进行限制。
7)对多表连接的视图来讲,一个插入语句只能对单独某个表的字段进行操作。
2、修改数据:同数据表的修改
3、删除记录
同数据表的删除操作,但就注意如下:
1)通过视图删除数据将最终体现为从基表中删除数据。 当一个视图由两个以上基表构成时,不允许删除视图中的数据。
2)若视图中的字段是常数或统计结果的话,允许执行delete操作,但不允许insert或update操作。
绝大部分我已经测试过,环境为05,仅供参考!
附录:
1、SET QUOTED_IDENTIFIER
当在数据库中新建一个名字是USER的表的时候,常常会带来一些麻烦,因为USER是SQL中的关键字,但是上面的几个语句不会报错。再说一个概念:标示符是SQL中的中括号[]。
当SET QUOTED_IDENTIFIER值为ON时,双引号内的字符被当作是数据库对象。就是说双引号" "和标识符[]效果是一样样的,他们都表示引用的字符是数据库对象。单引号'表示字符串的边界。
当SET QUOTDE_IDENTIFIER OFF时,双引号被解释为字符串的边界,和单引号的作用是类似的。就是说双引号"不能当做标识符使用,但是可以当做字符边界,和单引号'的效果是一样样的。
2 ANSI_NULLS
SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍会返回零行。
当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。
视图中有多个表的更新、删除、新增失败。