• Mysql-视图


    1.什么是视图?

      视图是由数据库中的一个表或多个表导出的虚拟表。其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而没有存放视图中的数据。这些数据还是存在原来的表中,使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此视图中的数据是依赖于原来的表中的数据。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

      视图是存储在数据库中的查询的SQL语句,它主要出于两种原因:

      1.1 安全原因:视图可以隐藏一些数据

      1.2 可以使复杂的查询易于理解和使用。

    2.视图的作用

      对视图中所引用的基础表来说,视图的作用类似于筛选。

      2.1 简单性:看到的就是需要的

          视图不仅可以简化用户对数据的理解,也可以简化他们的操作,那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

      2.2 安全性

          视图的安全性可以防止未授权用户查看特定的行或列,使有权限用户只能看到表中特定行的方法

          1.在表中增加一个标志用户名的列

          2.建立视图,使用户只能看到标有自己用户名的列

          3.把视图授权给其他用户

        2.3 逻辑数据独立性

        视图可以使应用程序和数据库表在一定程度上独立,如果没有视图,程序一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。

        1.如果应用建立在数据表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而使应用程序可以不动。

        2.如果应用建立在数据表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使应用程序可以不动。

        3.如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而使应用程序可以不动

        4.如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而使数据库可以不动。

      3. 创建视图

      创建视图是在已经存在的数据库表上建立视图,视图可以建立在一张表中,也可以建立在多张表中。

      3.1 查看创建视图的权限

      创建视图需要CREATE VIEW的权限,同时应该具有查询涉及列的权限。可以使用select语句来查询这些权限信息,查询语法如下。

    select Select_priv,Create_view_priv from mysql.user where user=‘root';
    

    3.2 创建视图

      1.在tb_book上建立视图

    CREATE 
    VIEW book_view(a_sort,a_talk,a_books)//视图名(属性清单:可选参数,指定视图中各个属性的名称,默认情况下与select语句中查询的属性相同) AS SELECT sort ,talk,books from tb_book;

      2.在tb_book表和tb_user表上创建名为book_view1的视图

    CREATE  algorithm=merge //视图选择的算法
    VIEW book_view1(a_sort,a_talk,a_books,a_name)
    as select sort,talk,books,tb_user.name from tb_book,tb_name where tb_book.id=tb_name.id 
    with local check option;//表示视图更新时要保证在该视图的权限范围之内。
    

    3.在实际开发过程中的数据表中可能有很多的字段,但某个模块可能只需要其中的几个。为了提高查询的速度和简化操作,可以将该模块需要的字段单独提取出来放在某个视图中。

     例子:有学生表和成绩表,在建立的视图中只含有与学生成绩有关的字段

    CREATE 
    view scoreinfo 
    as select sno.sname,yw,wy,sx from tb_student,tb_score where tb_student.id=tb_score.sid;
    

    创建视图的注意事项:

    1.运行创建视图的语句需要用户具有创建视图的权限,若加了[or replace]时,还需要用户具有删除视图的权限

    2.select语句不能包含from子句中的子查询

    3.select语句不能引用系统或用户变量

    4.select语句不能使用预处理语句参数

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

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

    7.在定义中不能引用临时表,不能使用临时视图

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

    4.视图操作

    4.1查看视图

      1.DESCRIBE(简写成DESC)

    DESC bool_view1;
    

       2.show table status

    show table status like 'scoreinfo'//like表示后面匹配的是字符串,视图是要查看的视图名称,需要用单引号定义
    

      3.show create view 

    show create view scoreinfo; 

    4.2 修改视图

    修改视图是修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。

    1.create or replace view

    CREATE OR REPLACE 
    ALGORITHM=TEMPTABLE
    VIEW  book_view(a_sore,a_book)
    as select sort,books from tb_book;
    

    2.alter

    alter view book_view1(a_sort)
    as select sort
    from tb_book
    with check option; 

    4.3 更新视图

    对视图的更新其实就是对表的更新,更新视图是指通过视图来插入,更新,删除表中的数据。因为视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据,超出了范围,就不能更新。

     update scoreinfo set yw="90" where id=2;
    

    1.更新视图的限制

     (1)视图中包含count(),sum(),max(),min()函数

    create
    view bookview(a_sort,a_book)
    as select sort,books ,count(name) from tb_book group by id;
    

      (2) 视图中包含union,union all,distinct,group by 和having等关键字

    create 
    view book_view1(a_sort,a_book)
    as select sort,books from tb_book group by id;
    

     (3)常量视图

    CREATE 
    VIEW book_view 
    as select 'Aric' as a_book;
    

     (4) 视图的select中包含子查询

    CREATE 
    VIEW book_view1(a_sort)
    as select (select name  from tb_book);
    

    (5)由不可更新的视图导出的视图

    CREATE 
    VIEW book_view1
    AS SELECT * FROM book_view2;
    

    (6) 创建视图时,ALGORITHM为TEMPTABLE类型 

    CREATE ALGORITHM=TEMPTABLE
    VIEW book_view1
    as select * from tb_book;

    4.4 删除视图

     删除视图是指删除数据库中已经存在的视图。删除视图时,只能删除视图的定义,不会删除数据。mysql中使用DROP VIEW语句来删除视图。但是用户必须有DROP权限。

    DROP VIEW IF EXISTS bOOK_view1;
    

      

  • 相关阅读:
    随机数生成
    C#根据流下载文件
    C# 改变Windows中服务的登录身份 (账户名和密码)
    SqlServer查看数据库信息及服务器级、数据库级、数据库独立 用户权限
    C# 两个List<T>(T是类)使用Contains比较元素的方法
    你真正了解public、internal、protected、private吗?不妨幽默一些
    【WCF Restful】Post传参示范
    VMware虚拟机可与Win10物理机互ping并可访问互联网的设置方法
    服务器Oracle数据库配置与客户端访问数据库的一系列必要设置
    Winform ListBox输出信息并自动滚动至底部
  • 原文地址:https://www.cnblogs.com/cainame/p/11255601.html
Copyright © 2020-2023  润新知