zoukankan      html  css  js  c++  java
  • 视图是什么?

    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 的行。

       

       视图中有多个表的更新、删除、新增失败。

  • 相关阅读:
    MyBatis(第三方缓存整合原理&ehcache适配包下载)
    MyBatis(缓存机制)
    MyBatis(动态SQL2)
    MyBatis(动态SQL)
    MyBatis(映射文件中使用foreach标签时报错,属性collection的问题)
    MyBatis映射文件(编写SQL语句;可有可无(无的时候,使用注解编程))
    Python virtualenv with Sublime Text 3
    python & mongo问题记录
    CentOS On VirtualBox
    MySQL GROUP BY用法
  • 原文地址:https://www.cnblogs.com/hao-1234-1234/p/7278134.html
Copyright © 2011-2022 走看看