精华内容
下载资源
问答
  • 虚拟表的结构来源不是自己定义的,而是从对应的基表中产生(视图的数据来源) 注:虚拟表的数据也不是从自己来的 二、创建视图 1、基本语法 -- 创建视图 -- select语句:可以是 普通查询|连接查询|联合查询|...

    一、视图

    1、视图:view。视图是一种有结构(有行有列的二维表结构)但没结果(结构中不真实存放数据)的虚拟表。虚拟表的结构来源不是自己定义的,而是从对应的基表中产生(视图的数据来源)

    注:虚拟表的数据也不是从自己来的

    二、创建视图

    1、基本语法

        -- 创建视图
        -- select语句:可以是 普通查询|连接查询|联合查询|子查询
        create view 视图名字 as select 语句;

    (1)单表视图:基表只有一个

    (2)多表视图:基表来源至少是两个

    注:多表视图(基表有多张)的字段名不能重复。可以进行别名命名

        -- 创建视图:单表视图
        create view my_v1 as
        select * from my_student;
    
        -- 创建视图:多表视图
        create view my_v2 as
        select * from my_student as s left join my_class c on c.id = s.c_id;
        -- 报错:Duplicate column name 'id',即 id重复(表中不允许出现同名字段)
    
        -- 多表视图(基表有多张)的字段名不能重复(可以进行别名命名)
        
        create view my_v2 as
        select s.*, c.name as c_name, c.room from my_student as s
        left join my_class c on c.id = s.c_id;

    2、视图一旦创建,系统会在视图对应的数据库文件夹下创建一个对应的结构文件xxx.frm(视图不影响基表的存在,视图只是基于基表出现的东西)

    注:视图名和表名不能重复。因为产生的都是xxx.frm结构文件

    三、查看视图

    1、视图是一张虚拟表,表的所有查看方式都适用于视图

        -- 查看所有视图/表
        show tables;
        show tables like '视图名的模糊查询';
        show views;    -- 报错
        
        -- 查看视图结构
        desc 视图名;
        
        -- 查看视图创建语句
        show create table 视图名 [\G];
        show create view 视图名 [\G];

    四、使用视图

    1、使用视图主要是为了查询数据,将视图当做表一样查询即可(视图不保存结果,但可以从基表拿到数据)

        -- 使用视图,查询数据
        -- 视图不保存结果,但可以从基表拿到数据
        select * from my_v1;

    2、视图的执行,其本质就是执行封装的select语句

    五、修改视图

    1、视图本身不可修改,但视图的来源是可以修改的。修改视图,就是修改视图本身的来源语句(select语句)

    2、基本语法

        -- 修改视图
        alter view 视图名 as 新的select语句;
        -- 创建视图
        create view my_v3 as
        select * from my_student;
    
        -- 查看视图结构
        desc my_v3;
    
        -- 修改视图
        alter view my_v3 as
        select * from my_class;
    
        -- 查看视图结构
        desc my_v3; 

    六、删除视图

    1、基本语法

        -- 删除视图
        drop view 视图名字;
        -- 删除视图
        drop view my_v3;
        drop table my_v3;    -- 报错
        
        -- 表可以存数据,视图不存数据
        -- 所以,删除视图是只删除结构,而删除表table会找到table删除表中的数据
        -- 但实际上没有my_v3这张表来存储数据

    2、视图可以随意删除,因为视图没有数据。但建议不要这样做,因为创建视图的sql语句可能没有保存

    七、视图的意义

    1、视图可以节省sql语句。将一条复杂的查询语句使用视图进行保存,以后可以直接对视图进行操作

    2、数据安全。视图操作主要是针对查询的,如果对视图结构进行处理(删除),不会影响基表数据,相对安全

    3、视图往往是在大项目中使用,而且是多系统使用。可以对外提供有用的数据,但隐藏了关键(无用)的数据,数据安全

    4、视图可以对外提供友好型。不同的视图提供不同的数据,对外好像专门设计

    5、视图可以更好(容易)的进行权限控制

    注:基表的数据往往要极力隐藏,甚至都不让别人知道表的名字和结构

    八、视图数据操作

    1、视图可以进行数据写操作,但是有很多限制。一般只会给查看视图的权限,不会给增删改视图的权限

    2、对视图的操作会影响基表,基表的数据会发生改变

    3、新增数据

    (1)新增数据就是直接对视图进行数据新增

    注:给视图新增数据意味着不知道基表,不知道基表就没办法操作基表。所以,所有的操作都是对视图进行的操作

    (2)多表视图不能新增数据(不能给一个有连接的视图(多表视图)插入数据)

    (3)可以向单表视图插入数据。但是视图中包含的字段必须有基表中所有不能为空(或者没有默认值)的字段

    (4)视图是可以向基表插入数据的(对视图的操作会影响基表,基表的数据会发生改变)

        -- 单表视图插入数据
        -- 对视图的操作会影响基表,基表的数据会发生改变
        insert into 视图名 values ('值1', '值2', ... );
        -- 创建视图:单表视图
        create view my_v4 as
        select * from my_class;
    
        -- 查看数据
        select * from my_class;
        select * from my_v4;
    
        -- 单表视图插入数据
        -- 视图中包含的字段必须有基表中所有不能为空(或者没有默认值)的字段
        -- 对视图的操作影响了基表,基表数据发生了改变
        insert into my_v4 values (666, '6班', 'B606');
    
        -- 查看数据
        select * from my_v4;
        select * from my_class;

    4、删除数据

    (1)多表视图不能删除数据(此处的多表视图指的是连接) -- 试一下多表数据源(笛卡尔积)、联合 可不可以删除???

    eg:学生表和班级表连成一个视图,如果删除学生时把班级也删除了,就会造成所有的学生都没有匹配的班级了 -- 数据不可控

        -- 创建多表视图(连接)
        create view my_v5 as
        select s.*, c.name as c_name, c.room from my_student as s
        left join my_class c on c.id = s.c_id;
    
        -- 查看视图数据
        select * from my_v5;
    
        -- 多表视图删除数据
        delete from my_v5 where id = 1;
        -- 报错:Can not delete from join view 'mydatabase.my_v5'

    (2)单表视图可以删除数据

        -- 单表视图删除数据
        -- 对视图的操作会影响基表,基表的数据会发生改变
        delete from 视图名 [where条件];
        -- 创建视图:单表视图
        create view my_v6 as
        select * from my_class;
    
        -- 查看数据
        select * from my_class;
        select * from my_v6;
    
        -- 单表视图删除数据
        -- 对视图的操作影响了基表,基表数据发生了改变
        delete from my_v6 where id = 1;
    
        -- 查看数据
        select * from my_v6;
        select * from my_class;

    5、更新数据

    (1)理论上,不论单表视图还是多表视图,都可以更新数据

        -- 单表视图|多表视图 更新数据
        -- 对视图的操作会影响基表,基表的数据会发生改变
        update 视图名 set 字段名 = 值 [where条件]
        -- 创建多表视图
        create view my_v7 as
        select s.*, c.name as c_name, c.room from my_student as s
        left join my_class c on c.id = s.c_id
    
        -- 查看数据
        select * from my_v7;
    
        -- 多表视图更新数据
        -- 对视图的操作影响了基表,基表数据发生了改变
        update my_v7 set c_id = 333 where id = 3;
    
        -- 查看数据
        select * from my_v7;
        select * from my_student;
        select * from my_class;

    (2)更新限制:with check option。在创建视图的时候,如果对某个字段有限制,那么在对视图进行数据更新操作时,系统会进行验证。要保证更新之后,数据依然可以被视图查询出来(更新后的数据值依旧满足创建视图时对字段的限制),否则不让更新

        -- 更新限制(with check option)
        -- 创建视图,使用更新限制
        create view 视图名 as
        select * / 字段列表 from 表名 where条件1 with check option;
    
        -- 更新数据
        -- 更新的字段值必须满足创建视图时设定是where条件1,否则报错
        update 视图名 set 字段名 = 值 [where条件];
        -- 更新限制(with check option)
        -- 创建视图,使用更新限制
        -- where age>30:视图的数据来源都是age>30的数据
        -- with check option:视图更新的时候,不能将已经得到的age>30的数据改成age<=30的数据
        create view my_v8 as
        select * from my_student where age > 30 with check option;
    
        -- 查看数据
        select * from my_v8;
    
        -- 将视图可以查到的数据改成age<30的数据
        update my_v8 set age = 29 where id = 1;
        -- 报错:CHECK OPTION failed 'mydatabase.my_v8'
    
        -- 对视图的操作影响了基表,基表数据发生了改变
        update my_v8 set age = 36 where id = 1;    -- 修改成功
        -- 针对视图中的数据进行更新。视图中没有id=111的数据,所以修改无效
        update my_v8 set age = 36 where id = 111;
    
        -- 查看数据
        select * from my_v8;

    6、单表视图和多表视图的操作区别

    (1)单表视图:可以插入数据,可以删除数据,可以更新数据

    (2)多表视图:不能插入数据,不能删除数据,可以更新数据

    九、视图算法

    1、视图算法:系统对视图以及外部查询视图的select语句的一种解析方式

    2、视图算法分为三种

    (1)undefined:未定义(默认)。这不是一种实际使用的算法,是一种推卸责任的算法。告诉系统,视图没有定义算法,系统自己看着办

    (2)temptable:临时表算法。系统应该先执行视图的select语句,后执行外部查询语句(将第一次查询到的数据拿到内存中,再对内存进行操作,操作了两次。因为拿到内存的数据也不一定全部都是需要的数据)

    (3)merge:合并算法。系统应该先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行 -- 效率高(常态)

    注:

    a). 执行一次查询的效率比执行两次查询的效率高

    b). 系统经常选择merge,undefined时也会经常选择merge

    3、算法指定:在创建视图的时候

        -- 算法指定:在创建视图的时候
        create algorithm = 指定算法 view 视图名 as select 语句;
        -- 获取每个班级中最高的一个学生
        create view my_v9 as 
        select * from my_student order by height desc;
    
        -- 查询数据
        -- 下面两句sql效果一样,结果都是错误的
        select * from my_v9 group by c_id;
        select * from my_student group by c_id order by height desc;
    
        -- 指定算法为临时表temptable
        create algorithm = temptable view my_v10 as
        select * from my_student order by height desc;
    
        -- 查看视图创建语句
        show create view my_v10\G;
        
        -- 查看数据
        -- group by c_id:group by本身也带有排序效果,默认是升序asc。此处默认按照c_id升序排序
        select * from my_v10 group by c_id;    -- 结果正确
        -- 等价于
        select * from (select * from my_student order by height desc) as a group by a.c_id;

    4、视图算法选择:如果视图的select语句中会包含一个查询子句(5子句),而且很有可能顺序比外部的查询语句要靠后,此时一定要使用临时表算法temptable。其他情况可以不用指定,默认即可

     

    展开全文
  • 3、视图是基本表抽象和在逻辑意义上建立新关系。 区别: 1、视图是已经编译好sql语句。而表不是 2、表可以及时对它进行修改,但视图只能有创建的语句来修改 3、表是内容,视图是窗口 4、表只用物理空间而视图...

    联系:
    1、视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在;
    2、一个视图可以对应一个基本表,也可以对应多个基本表;
    3、视图是基本表的抽象和在逻辑意义上建立的新关系。

    区别:
    1、视图是已经编译好的sql语句。而表不是  
    2、表可以及时对它进行修改,但视图只能有创建的语句来修改
    3、表是内容,视图是窗口
    4、表只用物理空间而视图不占用物理空间,可以理解为计算机中的文件。
         视图只是逻辑概念的存在,没有实际的物理记录,是虚拟的内存表,可以理解为快捷方式
    5、表是内模式,视图是外模式
    6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
    7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。 
    8、视图的建立和删除只影响视图本身,不影响对应的基本表。

    视图是一个子查询,性能肯定会比直接查询要低(尽管sql内部有优化),所以使用视图时有一个必须要注意的,就是不要嵌套使用查询,尤其是复杂查询。
     

    /*创建基本表*/
    CREATE TABLE Student(
    	Sno CHAR(5) CONSTRAINT PK_Stu PRIMARY KEY,
    	Sname CHAR(20) CONSTRAINT UQ1 UNIQUE,
    	Ssex CHAR(2),
    	Sage INT NOT NULL CONSTRAINT CK1 CHECK(Sage>15 AND Sage<=35),
    	Sdept CHAR(15),CONSTRAINT CK2 CHECK(Ssex IN ('男','女') AND Sno LIKE '95%')
    )
    CREATE TABLE Course(
    	Cno CHAR(4) PRIMARY KEY
        /*略...*/
    )
    CREATE TABLE SC(
    	Sno CHAR(5) REFERENCES Student(Sno),
    	Cno CHAR(4) REFERENCES Course(Cno),
    	Grade INT,
    	PRIMARY Key(Sno,Cno)
    )
    
    /*向Student表中增加Scity列*/
    ALTER TABLE Student ADD Scity CHAR(20) CONSTRAINT CK3 CHECK(Scity IN ('杭州','宁波'))
    
    /*删除*/
    ALTER TABLE Student DROP COLUMN Scity
    
    /*建立索引*/
    CREATE UNIQUE INDEX Sno ON Student(Sno DESC)
    CREATE VIEW Stu1001 AS
    	SELECT *
    	FROM *
    	WHERE Sno='1001'

     

    展开全文
  • 视图的好处,可以主要分为四点:       第一点:  使用视图,可以定制用户数据,聚焦特定的数据。    解释:  在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,  采购人员,...
    视图的好处,可以主要分为四点:   
      
        
      第一点:   
      使用视图,可以定制用户数据,聚焦特定的数据。   
        
      解释:   
      在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,   
      采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没   
      有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视   
      图,以后他在查询数据时,只需select   *   from   view_caigou   就可以啦。   
        
      第二点:使用视图,可以简化数据操作。   
        
      解释:我们在使用查询时,在很多时候我们要使用聚合函数,同时还要   
      显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能   
      会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我   
      们只需要select   *   from   view1就可以啦~,是不是很方便呀~   
        
      第三点:使用视图,基表中的数据就有了一定的安全性   
        
      因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以   
      将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集   
      合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改   
      和删除,可以保证数据的安全性。   
        
      第四点:可以合并分离的数据,创建分区视图   
        
      随着社会的发展,公司的业务量的不断的扩大,一个大公司,下属都设有很   
      多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务   
      情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些   
      数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字,   
      将各分公司的数据合并为一个视图。   
        

      以上,就是我认为视图的作用,实际上很多公司都使用视图来查询数据的。



    CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
        VIEW view_name [(column_list)]
        AS select_statement
        [WITH [CASCADED | LOCAL] CHECK OPTION]

    该语句能创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。select_statement是一种SELECT语句,它给出了视图的定义。该语句可从基表或其他视图进行选择。

    该语句要求具有针对视图的CREATE VIEW权限,以及针对由SELECT语句选择的每一列上的某些权限。对于在SELECT语句中其他地方使用的列,必须具有SELECT权限。如果还有OR REPLACE子句,必须在视图上具有DROP权限。

    视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确创建视图,创建时,应将名称指定为db_name.view_name

    mysql> CREATE VIEW test.v AS SELECT * FROM t;

    表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。

    视图必须具有唯一的列名,不得有重复,就像基表那样。默认情况下,由SELECT语句检索的列名将用作视图列名。要想为视图列定义明确的名称,可使用可选的column_list子句,列出由逗号隔开的IDcolumn_list中的名称数目必须等于SELECT语句检索的列数。

    SELECT语句检索的列可以是对表列的简单引用。也可以是使用函数、常量值、操作符等的表达式。

    对于SELECT语句中不合格的表或视图,将根据默认的数据库进行解释。通过用恰当的数据库名称限定表或视图名,视图能够引用表或其他数据库中的视图。

    能够使用多种SELECT语句创建视图。视图能够引用基表或其他视图。它能使用联合、UNION和子查询。SELECT甚至不需引用任何表。在下面的示例中,定义了从另一表选择两列的视图,并给出了根据这些列计算的表达式:

    mysql> CREATE TABLE t (qty INT, price INT);
    mysql> INSERT INTO t VALUES(3, 50);
    mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
    mysql> SELECT * FROM v;
    +------+-------+-------+
    | qty  | price | value |
    +------+-------+-------+
    |    3 |    50 |   150 |
    +------+-------+-------+

    视图定义服从下述限制:

    ·         SELECT语句不能包含FROM子句中的子查询。

    ·         SELECT语句不能引用系统或用户变量。

    ·         SELECT语句不能引用预处理语句参数。

    ·         在存储子程序内,定义不能引用子程序参数或局部变量。

    ·         在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。

    ·         在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。

    ·         在视图定义中命名的表必须已存在。

    ·         不能将触发程序与视图关联在一起。

    在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。

    对于定义中的其他选项或子句,它们将被增加到引用视图的语句的选项或子句中,但效果未定义。例如,如果在视图定义中包含LIMIT子句,而且从特定视图进行了选择,而该视图使用了具有自己LIMIT子句的语句,那么对使用哪个LIMIT未作定义。相同的原理也适用于其他选项,如跟在SELECT关键字后的ALLDISTINCTSQL_SMALL_RESULT,并适用于其他子句,如INTOFOR UPDATELOCK IN SHARE MODE、以及PROCEDURE

    如果创建了视图,并通过更改系统变量更改了查询处理环境,会影响从视图获得的结果:

    mysql> CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> SET NAMES 'latin1';
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> SELECT * FROM v;
    +-------------------+---------------------+
    | CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
    +-------------------+---------------------+
    | latin1            | latin1_swedish_ci   |
    +-------------------+---------------------+
    1 row in set (0.00 sec)
     
    mysql> SET NAMES 'utf8';
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> SELECT * FROM v;
    +-------------------+---------------------+
    | CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
    +-------------------+---------------------+
    | utf8              | utf8_general_ci     |
    +-------------------+---------------------+
    1 row in set (0.00 sec)

    可选的ALGORITHM子句是对标准SQLMySQL扩展。ALGORITHM可取三个值:MERGETEMPTABLEUNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。

    对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

    对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

    对于UNDEFINEDMySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

    明确选择TEMPTABLE1个原因在于,创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。

    视图算法可以是UNDEFINED,有三种方式:

    ·         CREATE VIEW语句中没有ALGORITHM子句。

    ·         CREATE VIEW语句有1个显式ALGORITHM = UNDEFINED子句。

    ·         为仅能用临时表处理的视图指定ALGORITHM = MERGE。在这种情况下,MySQL将生成告警,并将算法设置为UNDEFINED

    正如前面所介绍的那样,通过将视图定义中的对应部分合并到引用视图的语句中,对MERGE进行处理。在下面的示例中,简要介绍了MERGE的工作方式。在该示例中,假定有1个具有下述定义的视图v_merge

    CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
    SELECT c1, c2 FROM t WHERE c3 > 100;

    示例1:假定发出了下述语句:

    SELECT * FROM v_merge;

    MySQL以下述方式处理语句:

    ·         v_merge成为t

    ·         *成为vc1vc2,与c1c2对应

    ·         增加视图WHERE子句

    所产生的将执行的语句为:

    SELECT c1, c2 FROM t WHERE c3 > 100;

    示例2:假定发出了下述语句:

    SELECT * FROM v_merge WHERE vc1 < 100;

    该语句的处理方式与前面介绍的类似,但vc1 < 100变为c1 < 100,并使用AND连接词将视图的WHERE子句添加到语句的WHERE子句中(增加了圆括号以确保以正确的优先顺序执行子句部分)。所得的将要执行的语句变为:

    SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);

    事实上,将要执行的语句是具有下述形式的WHERE子句:

    WHERE (select WHERE) AND (view WHERE)

    MERGE算法要求视图中的行和基表中的行具有一对一的关系。如果不具有该关系。必须使用临时表取而代之。如果视图包含下述结构中的任何一种,将失去一对一的关系:

    ·         聚合函数SUM(), MIN(), MAX(), COUNT()等)。

    ·         DISTINCT

    ·         GROUP BY

    ·         HAVING

    ·         UNIONUNION ALL

    ·         仅引用文字值(在该情况下,没有基本表)。

    某些视图是可更新的。也就是说,可以在诸如UPDATEDELETEINSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:

    ·         聚合函数(SUM(), MIN(), MAX(), COUNT()等)。

    ·         DISTINCT

    ·         GROUP BY

    ·         HAVING

    ·         UNIONUNION ALL

    ·         位于选择列表中的子查询

    ·         Join

    ·         FROM子句中的不可更新视图

    ·         WHERE子句中的子查询,引用FROM子句中的表。

    ·         仅引用文字值(在该情况下,没有要更新的基本表)。

    ·         ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。

    关于可插入性(可用INSERT语句更新),如果它也满足关于视图列的下述额外要求,可更新的视图也是可插入的:

    ·         不得有重复的视图列名称。

    ·         视图必须包含没有默认值的基表中的所有列。

    ·         视图列必须是简单的列引用而不是导出列。导出列不是简单的列引用,而是从表达式导出的。下面给出了一些导出列示例:

    ·                3.14159
    ·                col1 + 3
    ·                UPPER(col2)
    ·                col3 / col4
    ·                (subquery)

    混合了简单列引用和导出列的视图是不可插入的,但是,如果仅更新非导出列,视图是可更新的。考虑下述视图:

    CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;

    该视图是不可插入的,这是因为col2是从表达式导出的。但是,如果更新时不更新col2,它是可更新的。这类更新是允许的:

    UPDATE v SET col1 = 0;

    下述更新是不允许的,原因在于,它试图更新导出列:

    UPDATE v SET col2 = 0;

    在某些情况下,能够更新多表视图,假定它能使用MERGE算法进行处理。为此,视图必须使用内部联合(而不是外部联合或UNION)。此外,仅能更新视图定义中的单个表,因此,SET子句必须仅命名视图中某一表的列。即使从理论上讲也是可更新的,不允许使用UNION ALL的视图,这是因为,在实施中将使用临时表来处理它们。

    对于多表可更新视图,如果是将其插入单个表中,INSERT能够工作。不支持DELETE

    对于可更新视图,可给定WITH CHECK OPTION子句来防止插入或更新行,除非作用在行上的select_statement中的WHERE子句为

    在关于可更新视图的WITH CHECK OPTION子句中,当视图是根据另一个视图定义的时,LOCALCASCADED关键字决定了检查测试的范围。LOCAL关键字对CHECK OPTION进行了限制,使其仅作用在定义的视图上,CASCADED会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为CASCADED。请考虑下述表和视图集合的定义:

    mysql> CREATE TABLE t1 (a INT);
    mysql> CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
        -> WITH CHECK OPTION;
    mysql> CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
        -> WITH LOCAL CHECK OPTION;
    mysql> CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
        -> WITH CASCADED CHECK OPTION;

    这里,视图v2v3是根据另一视图v1定义的。v2具有LOCAL检查选项,因此,仅会针对v2检查对插入项进行测试。v3具有CASCADED检查选项,因此,不仅会针对它自己的检查对插入项进行测试,也会针对基本视图的检查对插入项进行测试。在下面的语句中,介绍了这些差异:

    ql> INSERT INTO v2 VALUES (2);
    Query OK, 1 row affected (0.00 sec)
    mysql> INSERT INTO v3 VALUES (2);
    ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'  

    展开全文
  • 1、视图的作用 视图的作用: 第一点:使用视图,...有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视 图,以后他在查询数据时,只需select * from view_caigou 就 可以啦。 第二点:使用视图,可...

    1、视图的作用
    视图的作用:
    第一点:使用视图,可以定制用户数据,聚焦特定的数据。

    解释:
    在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,
    采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没
    有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视
    图,以后他在查询数据时,只需select * from view_caigou 就
    可以啦。

    第二点:使用视图,可以简化数据操作。

    解释:我们在使用查询时,在很多时候我们要使用聚合函数,同时还要
    显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能
    会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我
    们只需要select * from view1就可以啦~,是不是很方便呀~
    

    第三点:使用视图,基表中的数据就有了一定的安全性

    解释:
    因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以
    将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集
    合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改
    和删除,可以保证数据的安全性。

    第四点:可以合并分离的数据,创建分区视图(//目前我没用到)

    解释:
    随着社会的发展,公司的业务量的不断的扩大,一个大公司,下属都设有很
    多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务
    情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些
    数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字,
    将各分公司的数据合并为一个视图。
    

    2、Sql server中创建视图和创建表是一样的
    2.1)创建表是这样的

    --------创建表-------
    –判断是否存在–
    if exists (select * from sysobjects where name = ‘Tab_EdsProd’)
    drop table Tab_EdsProd
    go
    –创建表
    create table Tab_EdsProd
    (
    Mid int identity(1,1) primary key,
    Code varchar(10) null,
    Name varchar(20) null
    )
    –添加数据–
    insert into Tab_EdsProd(Code,Name) values(‘001’,‘张三’);
    insert into Tab_EdsProd(Code,Name) values(‘002’,‘李四’)
    –查询数据–
    select * from Tab_EdsProd

    2.3)创建视图是这样的

    --------创建视图-------
    –判断是否存在–
    if exists (select * from sysobjects where name = ‘View_EdsProd’)
    drop view View_EdsProd
    go
    –创建视图
    create view View_EdsProd
    as
    select * from Tab_EdsProd where Mid>1
    go
    –使用视图–
    select *from View_EdsProd
    在这里插入图片描述

    如何创建的视图不允许更改,可以加上 with encryption

    --------创建加密视图-------
    –判断是否存在–
    if exists (select * from sysobjects where name = ‘View_Jm_EdsProd’)
    drop view View_Jm_EdsProd
    go
    –创建视图
    create view View_Jm_EdsProd
    with encryption
    as
    select * from Tab_EdsProd where Mid>1
    go
    –使用视图–
    select *from View_Jm_EdsProd

    加上with encryption 不可修改视图
    在这里插入图片描述
    参考文档:
    https://www.cnblogs.com/xielong/p/8584736.html

    视图定义来源于
    http://blog.csdn.net/u014242422/article/details/53266859
    平时多记记,到用时才能看看,记录你的进步,分享你的成果

    展开全文
  • 实验三:完整性约束、视图、存储过程和数据安全[目的和意义]掌握创建各种完整性约束方法;掌握创建和使用视图、存储过程和索引方法;...2.学习创建视图、存储过程和索引方法。3.学习利用用户管理和视图实...
  • 实验三:完整性约束、视图、存储过程和数据安全[目的和意义]掌握创建各种完整性约束方法;掌握创建和使用视图、存储过程和索引方法;...2.学习创建视图、存储过程和索引方法。3.学习利用用户管理和视图实...
  • 视图的好处,可以主要分为四点: 我简单的说一下,希望你能明白。 第一点: 使用视图,可以定制用户数据,聚焦特定的数据。 解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话, 采购人员,...
  • 原文地址:Sql server中 如何用sql语句创建视图 1、视图的作用 视图的作用: 第一点:使用视图,可以定制用户数据,聚焦特定的数据。 解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话...
  • 简介 什么是视图 视图(View)是一种虚拟存在的表。... 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系; 视图是由基本表(实表)产生的表(虚表); 视图的建立和删除不影响基
  • 1、视图的作用 视图的作用: 第一点:使用视图,可以定制用户数据,聚焦特定的数据。... 有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视 图,以后他在查询数据时,只需select * from vie...
  • 1、视图的作用 视图的作用: 第一点:使用视图,可以定制用户数据,聚焦特定的数据。 ... 有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视 图,以后他在查询数据时,只需sel...
  • 一般创建ON COMMIT刷新方式的物化视图都是快速刷新的,完全刷新的ON COMMIT物化视图的意义不大,因此本文例子中使用的都是REFRESH FAST ON COMMIT方式。而是否快速刷新对权限的影响不过是增加了对基表物化视图...
  • 视图

    2021-02-25 21:31:22
    即视图就是执行查询语句后所返回的结果集,所以在创建视图的时候,主要就是创建这条SQL查询语句。 对于普通的数据表来说,视图具有以下的一些特点: 1、简单:因为视图是查询语句执行后返回的已经过滤好的复合条件...
  • 视图的操作

    2019-07-08 14:44:00
    视图的特点:视图可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系视图是基本表(实表)产生的表(虚表)视图的删除和建立不影响基本表对视图内容的更新(添加、删除和修改)直接影响基本表当视图来自多个...
  • APP类里有需求再写,没需求也不要写,MFC在类CDocument和CView中为稳定视图提供了基础结构,CWinApp、CFrameWnd和这两个类合作,把所有片段连在了一起数据存储和加载由文档类来完成,数据显示和修改由View类...
  • 为什么要创建视图?可以实现查询的简化,而且还会提高安全性简述视图的概念。本质上是一种虚拟表,其内容与真实的表相似。包含一系列带有名称的列和行的数据。但是,视图并不在数据库中以存储数据值的形式存在,行和...
  • MySQL数据库的视图

    2020-01-08 08:59:23
    文章目录视图的定义创建视图查看视图删除视图 视图的定义 视图的本质是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库以存储的数据值形式存在。行和列的数据来自...
  • 视图的特点如下:视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。视图是由基本表(实表)产生的表(虚表)。视图的建立和删除不影响基本表。对视图内容的更新(添加、删除和修改)直接影响基本表。当...
  • Demo Instruction: 从... 填写属性视图的基本信息: Name: 视图的技术名称,每个视图只有一个唯一的技术名称,且不可修改 Description: 视图的说明,可以随意填写有一定意义标识的文字 Package:视图是属于哪个开...
  • 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系。 视图是由基本表(实表)产生的表(虚表)。 视图的建立和删除不影响基本表。 对视图内容的更新(添加、删除和修改)直接影响基本表。 当视图来自多...
  • 视图的作用

    2017-04-25 16:25:03
    视图的好处,可以主要分为四点: 我简单的说一下,希望你能明白。 第一点: 使用视图,可以定制用户数据,聚焦特定的数据。 解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话, ...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 318
精华内容 127
关键字:

创建视图的意义